浅谈微信APP支付

        由于微信支付文档写的太高端,有些东西不说明白,所以在这里做下详细的笔记,以便日后随时查看,好记性不如烂笔头。

        首先准备工作要做好,申请好你的微信开放平台审核通过的APPID,微信支付分配的商户号,还有在微信商户平台-账户设置-API安全-密钥设置中设置你的密钥key。

        准备工作做好了,先来看下整个商户APP调起微信支付的流程:

1、用户通过商户APP下单后选择微信支付

2、商户后台调用微信统一下单接口,这里会第一次签名

3、商户后台验证返回状态码以及微信返回的签名,确认无误后,再重新生成签名,这里是第二次签名

4、商户后台将参数传给商户APP

5、商户APP接收到商户后台传来的参数后,发起微信支付

6、微信后台异步通知支付结果给回调URL,商户后台在回调接口里做相关逻辑处理

        流程知道后,这里会有几个细节,容易掉到坑里。需要注意的地方有:

1、第一次签名会有如下几个必需的参数

        应用ID:appid

        商户号:mch_id

        随机字符串:nonce_str

        商品描述:body

        商户订单号:out_trade_no

        总金额:total_fee

        终端IP:spbill_create_ip

        通知地址:notify_url

        交易类型:trade_type

        密钥:key

下面是部分参数的详细说明。

        生成25位随机字符串的函数demo:

public static String createRandomStr(){
  UUID uuid = UUID.randomUUID();
  StringBuilder sb = new StringBuilder(uuid.toString());
  return sb.substring(0,25).toString().toUpperCase();
}

        商品描述要按照固定格式,如:天天爱消除-游戏充值

        商户订单号由商户后台自定义生成,建议根据当前系统时间加随机序列来生成订单号,微信支付要求同一商户号下商户订单号保持唯一性。重新发起一笔支付要使用原订单号,避免重复支付;已支付过或已调用关单、撤销的订单号不能重新发起支付。

        订单总金额,单位为分!

        终端IP,写个获取IP的函数即可。

        通知地址实则是商户后台提供给微信支付后台调用的接口,接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。

        交易类型填写APP即可,因为我们是APP支付嘛~

2、签名算法,很重要,因为大部分出错都在这里

        第一次签名时,首先将上文提到的前9个参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串StringA,这里需要注意参数值为空时不参与签名,参数名区分大小写。然后在StringA后面拼接上"&key=你的密钥key"得到StringB,再对StringB进行MD5运算,最后将得到的所有字符串转换为大写,这样就得到了签名sign。

        完成第一次签名后,就可以调用微信统一下单接口了,参数为上面列出的前面9个参数和第一次签名sign的值,参数值用XML转义即可,CDATA标签用于说明数据不被XML解析器解析。

        第二次签名前,要经过验证签名,保证交易安全。第二次签名所需的参数,在微信的文档中并没有提到。商户后台成功请求微信统一下单接口后,会收到如下参数:

        图片

        其中prepay_id为微信返回的预支付会话标识。

        第二次签名的参数为:      

            应用ID:appid

            商户号:partnerid

            预支付交易会话ID:prepayid

            扩展字段:package

            随机字符串:noncestr

            时间戳:timestamp

        prepayid为微信返回的预支付会话标识

        package暂填写固定值Sign=WXPay

        生成签名的方法也是先按字典序排序,然后拼接上密钥key,再进行MD5运算,最好全部转大写,得到第二次签名。

3、验证签名

        验证签名是用来验证商户后台调用微信统一下单接口后微信返回的签名sign,生成验证签名的参数为该接口返回的参数中除去签名sign的其它所有参数,方法同上得到验证签名,用来与微信返回的sign作比较,equals方法返回true,则验证通过。

4、商户后台传给商户APP的七个必需的参数

        应用ID:appid

        商户号:partnerid

        预支付交易会话ID:prepayid

        扩展字段:package

        随机字符串:noncestr

        时间戳:timestamp

        签名:sign(这里的签名是第二次生成的签名)

5、商户APP利用这7个参数调起微信支付,微信支付后台异步回调通知商户后台支付结果。


猜你喜欢

转载自blog.csdn.net/N2H4N2H4/article/details/80995685