今天来分享一下之前做微信小程序微信支付遇到的一些坑,博主这里是微信小程序支付功能,因此选择的微信支付方式是JSAPI支付方式(温馨提示左下角有音乐哦)。
首先我们肯定是要在小程序后台绑定一个商户号的,接下来我们看一下整个开发流程如下图(微信官方图):
由此我们就可以得出下面这个支付的大致流程:
首先,选择商品和数量等,点击下单,然后后台将这些参数生成数字签名并以xml的方式传递,并调用微信统一下订单接口生成一张微信预支付订单表(此时也可以添加上自己业务逻辑),订单有效期都在半小时内,半小时后该条下单数据就失效了,因此应该在半小时内完成支付,签名成功后将微信返回的prepay_id等数据返回给前端,再由前端调起收银台完成支付。
由上面我们大概清楚了两点:
1.生成数字签名;
2.调用微信统一下订单;
3.小程序支付;
那么我们再来看看微信支付AIP接口文档:传送门
在返回数据中return_code 和result_code都为SUCCESS的为签名成功,返回参数含义可以通过传送门了解,这里博主就不再说明了。
通过AIP接口文档我们发现要想调用微信统一下订单接口那么我们就需要传递以下必填参数:
字段名变量名必填类型示例值描述
小程序ID
appid
是
String(32)
wxd678efh567hg6787
微信分配的小程序ID
商户号
mch_id
是
String(32)
1230000109
微信支付分配的商户号
随机字符串
nonce_str
是
String(32)
5K8264ILTKCH16CQ2502SI8ZNMTM67VS
随机字符串,长度要求在32位以内。推荐随机数生成算法
签名
sign
是
String(64)
C380BEC2BFD727A4B6845133519F3AD6
通过签名算法计算得出的签名值,详见签名生成算法
商品描述
body
是
String(128)
腾讯充值中心-QQ会员充值
商品简单描述,该字段请按照规范传递,具体请见参数规定
商户订单号
out_trade_no
是
String(32)
20150806125346
商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*且在同一个商户号下唯一。详见商户订单号
标价金额
total_fee
是
Int
88
订单总金额,单位为分,详见支付金额
终端IP
spbill_create_ip
是
String(64)
123.12.12.123
支持IPV4和IPV6两种格式的IP地址。调用微信支付API的机器IP
通知地址
notify_url
是
String(256)
http://www.weixin.qq.com/wxpay/pay.php
异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
交易类型
trade_type
是
String(16)
JSAPI
小程序取值如下:JSAPI,详细说明见参数规定
以上参数请仔细查看API接口文档说明,需注意随机字符转生成方法及位数,签名生成算法(博主采用MD5),商户订单号也就是自己平台生
成的订单号,金额是以分为单位;
下面我们重点来说一说数字签名的生成如图:
以上是java后台签名完调用微信统一下订单的步骤,下面我们来看小程序端完成支付前需要获取那些数据,官方文档:传送门
通过以上我们看到它是需要这些必填参数:
参数类型必填说明
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
是
签名,具体签名方案参见微信公众号支付帮助文档;
其中我们需要注意的是paySign这个参数,根据文档我看可以看到,生成这个参数是需要以下这些必填参数:
字段名变量名必填类型示例值描述
小程序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
签名类型