微信开放的小程序肯定离不开支付,只是关于支付模块,官方文档给的解释太少太少,而且涌现的零零散散,对付初期打仗的童鞋来说并没有看上去的那么大略。
这里将多少文档进行了整理,希望能减少大家踩坑的几率。

首先还是先看下支付的交互时序图

商户系统和微信支付系统紧张交互:

wxpayclassphp微信小法式  付出篇 Docker

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

关于登录这块,可以参考上一篇“登录篇”

2、商户server调用支付统一下单,api拜会公共api【统一下单API】

统一下单API是指商户在小程序中利用登录所得到的信息先调用该接口在微信支付做事后台天生预支付交易单,返回精确的预支付(prepay_id)交易后调起支付。

接口连接的URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder

字段名变量名必填类型示例值描述小程序IDappid是String(32)wxd678efh567hg6787微信分配的小程序ID商户号mch_id是String(32)1230000109微信支付分配的商户号设备号device_info否String(32)013467007045764终端设备号(门店号或收银设备ID),把稳:PC网页或公众年夜众号内支付请传\"大众WEB\公众随机字符串nonce_str是String(32)5K8264ILTKCH16CQ2502SI8ZNMTM67VS随机字符串,不长于32位。
推举随机数天生算法署名sign是String(32)C380BEC2BFD727A4B6845133519F3AD6署名,详见署名天生算法署名类型sign_type否String(32)HMAC-SHA256署名类型,目前支持HMAC-SHA256和MD5,默认为MD5商品描述body是String(128)腾讯充值中央-QQ会员充值商品大略描述,该字段须严格按照规范通报,详细请见参数规定商品详情detail否String(6000){\"大众goods_detail\"大众:[{\"大众goods_id\"大众:\"大众iphone6s_16G\"大众,\"大众wxpay_goods_id\"大众:\"大众1001\"大众,\公众goods_name\"大众:\公众iPhone6s 16G\"大众,\"大众quantity\"大众:1,\"大众price\"大众:528800,\公众goods_category\公众:\公众123456\"大众,\公众body\公众:\公众苹果手机\"大众},{\公众goods_id\公众:\公众iphone6s_32G\"大众,\公众wxpay_goods_id\"大众:\"大众1002\"大众,\"大众goods_name\公众:\公众iPhone6s 32G\"大众,\"大众quantity\公众:1,\"大众price\"大众:608800,\"大众goods_category\"大众:\公众123789\"大众,\公众body\公众:\"大众苹果手机\"大众}]}商品详细列表,利用Json格式,传输署名前请务必利用CDATA标签将JSON文本串保护起来。
goods_detail []:└ goods_id String 必填 32 商品的编号└ wxpay_goods_id String 可选 32 微信支付定义的统一商品编号└ goods_name String 必填 256 商品名称└ quantity Int 必填 商品数量└ price Int 必填 商品单价,单位为分└ goods_category String 可选 32 商品类目ID└ body String 可选 1000 商品描述信息附加数据attach否String(127)深圳分店附加数据,在查询API和支付关照中原样返回,该字段紧张用于商户携带订单的自定义数据商户订单号out_trade_no是String(32)20150806125346商户系统内部的订单号,32个字符内、可包含字母, 其他解释见商户订单号货币类型fee_type否String(16)CNY符合ISO 4217标准的三位字母代码,默认公民币:CNY,其他值列表详见货币类型总金额total_fee是Int888订单总金额,单位为分,详见支付金额终端IPspbill_create_ip是String(16)123.12.12.123APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
交易起始韶光time_start否String(14)20091225091010订单天生韶光,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。
其他详见韶光规则交易结束韶光time_expire否String(14)20091227091010订单失落效韶光,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。
其他详见韶光规则把稳:最短失落效韶光间隔必须大于5分钟商品标记goods_tag否String(32)WXG商品标记,代金券或立减优惠功能的参数,解释详见代金券或立减优惠关照地址notify_url是String(256)http://www.weixin.qq.com/wxpay/pay.php吸收微信支付异步关照回调地址,关照url必须为直接可访问的url,不能携带参数。
交易类型trade_type是String(16)JSAPI小程序取值如下:JSAPI,详细解释见参数规定指定支付办法limit_pay否String(32)no_creditno_credit--指定不能利用信用卡支付用户标识openid否String(128)oUpF8uMuAJO_M2pxb1Q9zNjWeS6otrade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。
openid如何获取,可参考【获取openid】。

举例如下:

<xml>

<appid>wx2421b1c4370ec43b</appid>

<attach>支付测试</attach>

<body>JSAPI支付测试</body>

<mch_id>10000100</mch_id>

<detail><![CDATA[{ \"大众goods_detail\"大众:[ { \"大众goods_id\公众:\"大众iphone6s_16G\"大众, \"大众wxpay_goods_id\"大众:\公众1001\"大众, \公众goods_name\"大众:\公众iPhone6s 16G\"大众, \"大众quantity\"大众:1, \"大众price\"大众:528800, \"大众goods_category\公众:\"大众123456\公众, \"大众body\公众:\"大众苹果手机\"大众 }, { \公众goods_id\"大众:\"大众iphone6s_32G\公众, \公众wxpay_goods_id\"大众:\公众1002\"大众, \"大众goods_name\公众:\"大众iPhone6s 32G\"大众, \"大众quantity\"大众:1, \公众price\"大众:608800, \公众goods_category\公众:\公众123789\"大众, \"大众body\公众:\"大众苹果手机\公众 } ] }]]></detail> <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str> <notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>

<openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid> <out_trade_no>1415659990</out_trade_no>

<spbill_create_ip>14.23.150.211</spbill_create_ip>

<total_fee>1</total_fee>

<trade_type>JSAPI</trade_type>

<sign>0CB01533B8C1EF103065174F50BCA001</sign>

</xml>

注:CDATA标签是为了数据不被XML解析器解析。

返回结果如下

字段名变量名必填类型示例值描述返回状态码return_code是String(16)SUCCESSSUCCESS/FAIL此字段是通信标识,非交易标识,交易是否成功须要查看result_code来判断返复书息return_msg否String(128)署名失落败返复书息,如非空,为缺点缘故原由署名失落败参数格式校验缺点

以下字段在return_code为SUCCESS的时候有返回

字段名变量名必填类型示例值描述小程序IDappid是String(32)wx8888888888888888调用接口提交的小程序ID商户号mch_id是String(32)1900000109调用接口提交的商户号设备号device_info否String(32)013467007045764调用接口提交的终端设备号,随机字符串nonce_str是String(32)5K8264ILTKCH16CQ2502SI8ZNMTM67VS微信返回的随机字符串署名sign是String(32)C380BEC2BFD727A4B6845133519F3AD6微信返回的署名,详见署名算法业务结果result_code是String(16)SUCCESSSUCCESS/FAIL缺点代码err_code否String(32)SYSTEMERROR详细拜会第6节缺点列表缺点代码描述err_code_des否String(128)系统缺点缺点返回的信息描述

以下字段在return_code 和result_code都为SUCCESS的时候有返回

字段名变量名必填类型示例值描述交易类型trade_type是String(16)JSAPI调用接口提交的交易类型,取值如下:JSAPI,详细解释见参数规定预支付交易会话标识prepay_id是String(64)wx201410272009395522657a690389285100微信天生的预支付回话标识,用于后续接口调用中利用,该值有效期为2小时

3、小程序调起支付,api拜会公共api【再次署名】

小程序调起支付数据署名字段列表

字段名变量名必填类型示例值描述小程序IDappId是Stringwxd678efh567hg6787微信分配的小程序ID韶光戳timeStamp是String1230000109韶光戳从1970年1月1日00:00:00至今的秒数,即当前的韶光随机串nonceStr是String5K8264ILTKCH16CQ2502SI8ZNMTM67VS随机字符串,不长于32位。
推举随机数天生算法数据包package是Stringrepay_id=12312333333333333统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=署名办法signType是StringMD5署名算法,暂支持 MD5

注:以上名称的大小写要严格把稳驼峰法。
appId也须要参与署名,署名算法只有MD5,且署名时要按照ASCII字典序排列。

调用wx.requestPayment(OBJECT)发起微信支付

Object参数解释:

参数类型必填解释timeStampDateInt是韶光戳从1970年1月1日00:00:00至今的秒数,即当前的韶光nonceStrString是随机字符串,长度为32个字符以下。
packageString是统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=signTypeString是署名算法,暂支持 MD5paySignString是署名,详细署名方案拜会微信公众年夜众号支付帮助文档;successFunction否接口调用成功的回调函数failFunction否接口调用失落败的回调函数completeFunction否接口调用结束的回调函数(调用成功、失落败都会实行)