博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信支付--理论
阅读量:3712 次
发布时间:2019-05-21

本文共 5013 字,大约阅读时间需要 16 分钟。

之前一个商城系统(微信小程序),使用过微信支付和微信退款功能,现在总结一下

购物支付流程:下单--》

微信退款:用户对该订单申请退款 ; 商户在商城管理端同意退款,实现微信退款

微信支付包括:

公众号支付

小程序支付

扫码支付

H5支付

app支付

刷卡支付

openId:

为了识别用户,每个用户针对每个公众号或小程序等应用产生一个operId 。公众号或小程序应用将openId存储在数据库中,便于下次登录时辨识其身份。

小程序部署:

开发设置:

支付设置:

开发管理:

当开发进行到一定阶段时,开发者提交代码后,可把对应版本设为体验版

需要上线时,把上传的代码提交给腾讯审核,审核通过后即可发布上线,如图

微信支付流程:(只写过微信支付和微信退款的后台代码,但是相关配置没有参与过;以后有时间再专门学习一下微信支付整个开发流程)

转   

不知道会不会被封。。。。

支付模式:

1、

付款码支付

付款码支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。

2、

Native支付

Native支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。

3、

JSAPI支付

JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:

  1. ◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
  2. ◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
  3. ◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付

4、

APP支付

APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。

5、

H5支付

H5支付主要是在手机、ipad等移动设备中通过浏览器来唤起微信支付的支付产品。

6、

小程序支付

小程序支付是专门被定义使用在小程序中的支付产品。目前在小程序中能且只能使用小程序支付的方式来唤起微信支付。

名词介绍:

微信支付系统

微信支付系统是指完成微信支付流程中涉及的API接口、后台业务处理系统、账务系统、回调通知等系统的总称。

商户后台系统

商户后台系统是商户后台处理业务系统的总称,例如:商户网站、收银系统、进销存系统、发货系统、客服系统等。

商户证书

商户证书是微信提供的二进制文件,商户系统发起与微信支付后台服务器通信请求的时候,作为微信支付后台识别商户真实身份的凭据

签名

商户后台和微信支付后台根据相同的密钥和算法生成一个结果,用于校验双方身份合法性。签名的算法由微信支付制定并公开,常用的签名方式有:MD5、SHA1、SHA256、HMAC等

JSAPI网页支付

JSAPI网页支付即前文说的公众号支付,可在微信公众号、朋友圈、聊天会话中点击页面链接,或者用微信“扫一扫”扫描页面地址二维码在微信中打开商户HTML5页面,在页面内下单完成支付

Openid

用户在小程序内的身份标识,不同小程序拥有不同的openid。商户后台系统通过登录授权、支付通知、查询订单等API可获取到用户的openid。主要用途是判断同一个用。可调用接口。

邮件中的账户参数与接口API参数对应关系见表格3.1:

邮件中参数 API参数名 详细说明
APPID appid appid是微信小程序后台APP的唯一标识,在小程序后台申请小程序账号后,微信会自动分配对应的appid,用于标识该应用。可在小程序-->设置-->开发设置中查看。
微信支付商户号 mch_id 商户申请微信支付后,由微信支付分配的商户收款账号。
API密钥 key 交易过程生成签名的密钥,仅保留在商户系统和微信支付后台,不会在网络中传播。商户妥善保管该Key,切勿在网络中传输,不能在其他客户端中存储,保证key不会被泄漏。商户可根据邮件提示登录微信商户平台进行设置。也可按以下路径设置:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
Appsecret secret AppSecret是APPID对应的接口密码,用于获取接口调用凭证时使用

接口规则:

协议规则:

商户接入微信支付,调用API必须遵循以下规则:

传输方式 为保证交易安全性,采用HTTPS传输
提交方式 采用POST方法提交
数据格式 提交和返回数据都为XML格式,根节点名为xml
字符编码 统一采用UTF-8字符编码
签名算法 MD5,后续会兼容SHA1、SHA256、HMAC等。
签名要求 请求和接收数据均需要校验签名,详细方法请参考
证书要求 调用申请退款、撤销订单接口需要商户证书
判断逻辑 先判断协议字段返回,再判断业务返回,最后判断交易状态

参数规定:

1、交易金额

交易金额默认为人民币交易,接口中参数支付金额单位为【分】,参数值不能带小数。对账单中的交易金额单位为【元】。

外币交易的支付金额精确到币种的最小单位,参数值不能带小数点。

2、交易类型trade_type

JSAPI--JSAPI支付(或小程序支付)、NATIVE--Native支付、APP--app支付,MWEB--H5支付,不同trade_type决定了调起支付的方式,请根据支付产品正确上传

MICROPAY--付款码支付,付款码支付有单独的支付接口,所以接口不需要上传,该字段在对账单中会出现

3、货币类型

境内商户号仅支持人民币

CNY:人民币

4、时间

标准北京时间,时区为东八区;如果商户的系统时间为非标准北京时间。参数值必须根据商户系统所在时区先换算成标准北京时间, 例如商户所在地为0时区的伦敦,当地时间为2014年11月11日0时0分0秒,换算成北京时间为2014年11月11日8时0分0秒。

5、时间戳

标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数。注意:部分系统取到的值为毫秒级,需要转换成秒(10位数字)。

6、商户订单号

商户支付的订单号由商户自定义生成,仅支持使用字母、数字、中划线-、下划线_、竖线|、星号*这些英文半角字符的组合,请勿使用汉字或全角等特殊字符。微信支付要求商户订单号保持唯一性(建议根据当前系统时间加随机序列来生成订单号)。重新发起一笔支付要使用原订单号,避免重复支付;已支付过或已调用关单、撤销(请见后文的API列表)的订单号不能重新发起支付。

7、body字段格式

使用场景 支付模式 商品字段规则 样例 备注
PC网站 扫码支付 浏览器打开的网站主页title名 -商品概述 腾讯充值中心-QQ会员充值  
微信浏览器 公众号支付 商家名称-销售商品类目 腾讯-游戏 线上电商,商家名称必须为实际销售商品的商家
门店扫码 公众号支付 店名-销售商品类目 小张南山店-超市 线下门店支付
门店扫码 扫码支付 店名-销售商品类目 小张南山店-超市 线下门店支付
门店付款码 付款码支付 店名-销售商品类目 小张南山店-超市 线下门店支付
第三方手机浏览器 H5支付 浏览器打开的移动网页的主页title名-商品概述 腾讯充值中心-QQ会员充值  
第三方APP APP支付 应用市场上的APP名字-商品概述 天天爱消除-游戏充值  

8、银行类型

字符型银行编码 银行名称

ICBC_DEBIT

工商银行(借记卡)

安全规范:

 

开放模式:

普通模式:常用;适用于有自己开发团队或外包开发商的直连商户收款。

服务商模式:

业务流程:

小程序支付的交互图如下:

商户系统和微信支付系统主要交互:

1、小程序内调用登录接口,获取到用户的openid,api参见公共api【】

wx.login(Object object)
调用接口获取登录凭证(code)
通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)

 

 

 

2、商户server调用支付统一下单,api参见公共api【】--  点击支付

统一下单

商户在小程序中先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易后调起支付。

 

 

 

                         3、商户server调用再次签名,api参见公共api【】   -- 输入支付密码

小程序调起支付API

URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder

 

 

4、商户server接4、接收支付通知,api参见公共api【】

支付结果通知:

支付完成后,微信会把相关支付结果及用户信息通过数据流的形式发送给商户,商户需要接收处理,并按文档规范返回应答。

 

 

 

5、商户server查询支付结果,api参见公共api【】

该接口提供所有微信支付订单的查询,商户可以通过查询订单接口主动查询订单状态,完成下一步的业务逻辑

 

小程序调起支付API

1、小程序调起支付数据签名字段列表:

字段名 变量名 必填 类型 示例值 描述
小程序ID appId String wxd678efh567hg6787 微信分配的小程序ID
时间戳 timeStamp String 1490840662 时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间
随机串 nonceStr String 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,不长于32位。推荐
数据包 package String prepay_id=wx2017033010242291fcfe0db70013231072 统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=wx2017033010242291fcfe0db70013231072
签名方式 signType String MD5 签名类型,默认为MD5,支持HMAC-SHA256和MD5。注意此处需与统一下单的签名类型一致

举例如下:

paySign = MD5(appId=wxd678efh567hg6787&nonceStr=5K8264ILTKCH16CQ2502SI8ZNMTM67VS&package=prepay_id=wx2017033010242291fcfe0db70013231072&signType=MD5&timeStamp=1490840662&key=qazwsxedcrfvtgbyhnujmikolp111111) = 22D9B4E54AB1950F51E0649E8810ACD6

2、调用wx.requestPayment(OBJECT)发起微信支付(点击支付功能)

参数 类型 必填 说明
timeStamp String 时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间
nonceStr String 随机字符串,长度为32个字符以下。
package String 统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*
signType String 签名类型,默认为MD5,支持HMAC-SHA256和MD5。注意此处需与统一下单的签名类型一致
paySign String 签名,具体签名方案参见;
success Function 接口调用成功的回调函数
fail Function 接口调用失败的回调函数
complete Function 接口调用结束的回调函数(调用成功、失败都会执行)

3、回调结果(此时是用户输入支付密码

回调类型 errMsg 说明
success requestPayment:ok 调用支付成功
fail requestPayment:fail cancel 用户取消支付
fail requestPayment:fail (detail message) 调用支付失败,其中 detail message 为后台返回的详细失败原因
后端开发:
//todo
 

转载地址:http://yjijn.baihongyu.com/

你可能感兴趣的文章
15.原型链总结
查看>>
2021-06-13蚂蚁金服面试补充
查看>>
16.js常用异步编程解决方案***
查看>>
js16:从输入url开始,前端如何优化
查看>>
2021-06-15滴滴面试补充
查看>>
2021-06-17网易面试补充
查看>>
2021-06-21网易面试补充
查看>>
2021-06-22滴滴面试补充
查看>>
2021-06-22vivo面试补充
查看>>
用学校邮箱使用微软OneDrive云存储空间5120G
查看>>
【软件质量保证与测试】实验二、缺陷管理软件Mantis安装与使用
查看>>
简单理解引用&
查看>>
【软件质量保证与测试】4.2逻辑覆盖测试
查看>>
Netty学习 (七、源码剖析Netty启动过程源码)
查看>>
2021“中兴捧月“图灵赛道总结
查看>>
【最新】python爬取全国主要城市经纬度
查看>>
python颜值分析
查看>>
python表白代码,照片隐藏表白话语!
查看>>
python报错cannot import name ‘BeautifulSoup‘ from ‘bs4‘
查看>>
记录博客第一次上热门
查看>>