请选择 进入手机版 | 继续访问电脑版
开启辅助访问
查看: 742|回复: 8

[技术研发] 微信小程序支付流程(注意事项),小程序支付回调

[复制链接]

该用户从未签到

4

主题

12

帖子

67

积分

注册会员

Rank: 2

积分
67
发表于 2016-12-8 18:32:17 | 显示全部楼层 |阅读模式

版权声明:本文为博主原创文章,转载请注明出处。


今天@yqbboy 同学遇到的问题分享给大家,希望可以避免:
请求微信支付接口要严格区分大小写,一点需要注意,我遇到的问题是:自己在获取预付单数据的时候,timestamp没有区分大小写,导致支付的收银台一直调用不起来。


支付步骤逻辑:
1. 小程序发起请求预支付
2. 服务端调用接口发起预支付信息
3. 微信小程序调起支付完成支付


1. 小程序发起请求预支付

1_副本.png

2. 服务端调用接口发起预支付信息

服务端接收到请求后,调用微信的api接口,调用成功会得到一个prepay_id 这个就是相当于小程序的预支付id 过程中会生成签名,按照官方文档的实例参数生成即可,如果非必填可选择不填,然后向 api 发送一个xml
参数讲解官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1
eg:

  1. <xml>
  2.    <appid>wx2421b1c4370ec43b</appid>
  3.    <attach>支付测试</attach>
  4.    <body>JSAPI支付测试</body>
  5.    <mch_id>10000100</mch_id>
  6.    <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>
  7.    <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
  8.    <notify_url>[url]http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>[/url]
  9.    <openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid>
  10.    <out_trade_no>1415659990</out_trade_no>
  11.    <spbill_create_ip>14.23.150.211</spbill_create_ip>
  12.    <total_fee>1</total_fee>
  13.    <trade_type>JSAPI</trade_type>
  14.    <sign>0CB01533B8C1EF103065174F50BCA001</sign>
  15. </xml>
复制代码

需要注意sign 生成方式和公众号生成方式一致,下面是PHP生成签名方法, 可根据不同的框架修改,记得修改 key

  1.      /**
  2.      * 生成签名
  3.      * @return 签名,本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值
  4.      */
  5.     public function MakeSign()
  6.     {
  7.         //签名步骤一:按字典序排序参数
  8.         ksort($this->_prepay);
  9.         $string = $this->ToUrlParams();
  10.         //签名步骤二:在string后加入KEY
  11.         $string = $string . "&key=".WxPayConfig::KEY;
  12.         //签名步骤三:MD5加密
  13.         $string = md5($string);
  14.         //签名步骤四:所有字符转为大写
  15.         $result = strtoupper($string);
  16.         return $result;
  17.     }

  18.     /**
  19.      * 格式化参数格式化成url参数
  20.      */
  21.     public function ToUrlParams()
  22.     {
  23.         $buff = "";
  24.         foreach ($this->values as $k => $v)
  25.         {
  26.             if($k != "sign" && $v != "" && !is_array($v)){
  27.                 $buff .= $k . "=" . $v . "&";
  28.             }
  29.         }

  30.         $buff = trim($buff, "&");
  31.         return $buff;
  32.     }
复制代码

调用统一下单api

  1. /**
  2.      * 统一下单调取返回值
  3.      * @return mixed
  4.      * $output['return_code'] 状态码 SUCCESS/FAIL
  5.      * $output['return_msg'] 返回信息,如非空,为错误原因 签名失败 参数格式校验错误
  6.      * $output['time'] 当前时间戳
  7.      * $output['nonceStr'] 随机字符串
  8.      * $output['prepay_id'] 预支付id
  9.      * $output['sign'] 签名
  10.      * */
  11.     public function pay_place_order()
  12.     {
  13.         $xml = '<xml>
  14.                    <appid>'.$this->_prepay['appid'].'</appid>
  15.                    <body>'.$this->_prepay['body'].'</body>
  16.                    <mch_id>'.$this->_prepay['mch_id'].'</mch_id>
  17.                    <nonce_str>'.$this->_prepay['nonce_str'].'</nonce_str>
  18.                    <notify_url>'.$this->_prepay['notify_url'].'</notify_url>
  19.                    <openid>'.$this->_prepay['openid'].'</openid>
  20.                    <out_trade_no>'.$this->_prepay['out_trade_no'].'</out_trade_no>
  21.                    <spbill_create_ip>'.$this->_prepay['spbill_create_ip'].'</spbill_create_ip>
  22.                    <total_fee>'.$this->_prepay['total_fee'].'</total_fee>
  23.                    <trade_type>'.$this->_prepay['trade_type'].'</trade_type>
  24.                    <sign>'.$this->MakeSign().'</sign>
  25.                 </xml>';
  26. //调用api,自定义对参数进行处理,改请求方式是自定义方式
  27.         $xml_result = post_request_https('https://api.mch.weixin.qq.com/pay/unifiedorder', $xml);
复制代码

对返回的参数从新生成sign,得到一个新的sign,返回小程序
注意: 生成返回小程序签的名参与生成的签名的字段有下图,记得拼接key ,使用的是调取api 返回的值

参数详解:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3

2_副本.png


3. 微信小程序调起支付完成支付

参数详解:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.html?t=20161122


3_副本.png


注意: 支付成功后微信回调通知签名验证,需要的参数是所有返回的参数字段除去sign字段,生成签名 = 返回字段中的sign(签名)

参数详解:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7

4_副本.png


谢谢!





回复

使用道具 举报

  • TA的每日心情
    奋斗
    2017-3-14 16:54
  • 签到天数: 1 天

    [LV.1]初来乍到

    176

    主题

    744

    帖子

    3706

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3706
    发表于 2016-12-9 10:56:15 | 显示全部楼层
    谢谢怀色同学的分享
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    8

    帖子

    24

    积分

    新手上路

    Rank: 1

    积分
    24
    发表于 2016-12-9 17:26:19 | 显示全部楼层
    清晰明了,谢谢楼主分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-3-14 16:54
  • 签到天数: 1 天

    [LV.1]初来乍到

    176

    主题

    744

    帖子

    3706

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3706
    发表于 2016-12-10 09:16:27 来自手机 | 显示全部楼层
    加入教程
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    帖子

    48

    积分

    新手上路

    Rank: 1

    积分
    48
    发表于 2016-12-14 13:49:49 | 显示全部楼层
    请求微信支付接口要严格区分大小写,一点需要注意,我遇到的问题是:自己在获取预付单数据的时候,timestamp没有区分大小写,导致支付的收银台一直调用不起来。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-3-14 16:54
  • 签到天数: 1 天

    [LV.1]初来乍到

    176

    主题

    744

    帖子

    3706

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    3706
    发表于 2016-12-14 13:53:27 | 显示全部楼层
    yqbboy 发表于 2016-12-14 13:49
    请求微信支付接口要严格区分大小写,一点需要注意,我遇到的问题是:自己在获取预付单数据的时候,timestam ...

    这个也算是饶坑指南了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14

    主题

    27

    帖子

    121

    积分

    注册会员

    Rank: 2

    积分
    121
    发表于 2016-12-15 11:26:28 | 显示全部楼层
    有时候真的明明是一个大小写的错误,往往会犯这就会造成很多时间去找bug真的细心很重要
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    66

    帖子

    258

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    258
    发表于 2016-12-15 11:45:56 | 显示全部楼层
    主要还是动态语言太随意
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17

    主题

    64

    帖子

    204

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    204
    发表于 2016-12-23 10:40:48 | 显示全部楼层
    细节很重要
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    进站必读上一条 /1 下一条