微信支付踩坑记录

参考官方文档

微信的支付文档写的是真的反人类,关键点都不带提的,强迫别人跟着前人一个坑接着一个坑踩;微信接口请求及返回的数据格式都是xml形式;

大体流程

  1. 服务器请求https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey,获取沙箱密钥,作为沙箱环境下的商户支付密钥(KEY),这步操作只在沙箱环境测试时才有
  2. 服务器请求https://api.mch.weixin.qq.com/pay/unifiedorder,统一下单,微信支付服务后台生成预支付交易单,根据返回的参数重新计算签名
  3. app根据上一步的参数,进行支付操作(这部分参考官方给的sdk跟demo)
  4. app支付成功后,微信会根据第二步中设置的回调地址进行回调,需要在回调中做响应的数据校验及业务处理
  5. 上面提到APP支付模式统一下单时,服务器会根据微信返回的预支付交易单重新计算签名并发送给客户端APP,但是使用NATIVE下模式一统一下单时,如果重新计算签名并处理成xml返回给微信,微信会报系统繁忙的错误提醒

1.step1沙箱环境

如果是正式支付环境,只需要用将商户支付密钥(KEY)设置为商户平台上(账户中心→API安全→设置密钥)上的API密钥即可;如果是使用沙箱环境进行测试,根据官方文档-最佳实践-支付验收指引:你需要请求微信借口 https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey 获取沙箱密钥并替换商户支付密钥;
如果使用微信sdk的话,这里还需要注意的是,每次计算签名时,使用的KEY要用沙箱密钥

2.302 found

沙箱环境调用微信接口会经常返302 found的一段html代码,而微信支付常规的输入输出都是xml格式的,校验接口返回的xml数据时就会解析出错,ErrorException: simplexml_load_string(): Entity: line 6: parser error : Opening and ending tag mismatch: hr line 5 and body,官方也没给出具体原因,应该是沙箱环境不稳定吧,只能多试几次了

3. step2 统一下单

接口链接: https://api.mch.weixin.qq.com/pay/unifiedorder 这部分请求参数需要注意total_fee在沙箱环境下不能随意设置金额,否则会报沙箱被扫支付金额(x)无效,请检查需要验证的case,官方也没有看到在哪里有说明,目前只知道app支付是101(分),由于最近沙箱用不了,其他的暂时还没法测;

4.step3 回调

这里需要注意的是,app支付成功后,会一直往服务器回调地址发通知,这里需要根据数据库中的订单信息对接收到的参数进行签名对比,金额对比,并做相应业务处理,最终给微信返回固定格式的成功信息,否则微信会一直发通知,通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m)

你可能感兴趣的:(微信支付踩坑记录)