微信支付服务器白名单,总结下我在微信支付中趟的那些坑。

前言

最近在研究微信支付,结果微信支付H5页面文档就有两套,下载PHP(最新的v3)源代码测试官方代码也有错误(能对上算怪了),我性子比较急,官方文档写的又比较精炼,经常看漏字拉字就掉坑里了。在本篇文章中我写一写我不理解的地方在对接微信支付时我走的一些弯路。顺便也让大家少走些弯路。

两套文档

微信H5支付有两份文档,在微信公众平台有一份,在商户平台又有另外一份,而且内容还不一样。下载下来官方DEMO该把该把可以使用了。官方DEMO精简的代码可以看我这一篇文章  200行代码学会微信H5支付 做完后我有在想微信公众平台那一份是做什么的?这是另一份文档的传送门 jssdk微信支付 后来在网上查有人说这个是新版的。微信商户给的DEMO是旧版的。我把jssdk(新版)的代码替换到官方DEMO的js代码。成功了。也就是说两份代码都可以支付。选择那种代码看自己爱好了。下面是新版的前端代码。(后端太多了,贴上前端把思路理顺就可以了)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52html>

王文晓-微信支付页面

$(function() {

wx.config({

debug: true,

appId: '<?php  echo $signPackage["appId"];?>',

timestamp: <?php  echo $signPackage["timestamp"];?>,

nonceStr: '<?php  echo $signPackage["nonceStr"];?>',

signature: '<?php  echo $signPackage["signature"];?>',

jsApiList: [

"chooseWXPay"  //支付

] // 所有要调用的 API 都要加到这个列表中

});

$('#aaa').on('click', function() {

wx.ready(function() { // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。

wx.chooseWXPay({

appId: '<?php  echo $da['appId']  ?>',

timestamp: '<?php  echo $da['timeStamp']  ?>', // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符

nonceStr: '<?php  echo $da['nonceStr']  ?>', // 支付签名随机串,不长于 32 位

package: '<?php  echo $da['package']  ?>', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)

signType: 'MD5', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'

paySign: '<?php  echo $da['paySign']  ?>', // 支付签名

success: function(res) {

// 支付成功后的回调函数

if (res.errMsg == "chooseWXPay:ok") {

//支付成功

alert('支付成功');

} else {

alert(res.errMsg);

}

},

cancel: function(res) {

//支付取消

alert('支付取消');

}

});

});

});

});

贡献一下

这里的$da数组是在后台使用微信支付的DEMO里面提供的。两份支付文档的区别在于前端。就是拿到预支付标识prepay_id后选择哪套前端都能走得通。

何时商户订单号重复

看到官方文档有在调用统一下单接口时有一个错误是商户订单号重复。但是我拿着官方的php DEMO 点击支付(不支付)又返回,来回十几次也没见提示重复啊(订单号一直是同一个)?什么场景会重复官方文档也没有。我就在网上找答案并且来回试。终于知道了:简单来说,要想重复提交不出现错误,就商品描述、商品金额和商户订单号这三个必须跟创建订单时候一样。也就是说调用统一订单API时,这三个参数提交的相同就不会提示重复。任何一个变了就会提示重复。

关于签名

签名这个地方也挺容易出错误。不管用微信jssdk支付还是微信DEMO那种方法,都是两次签名。签名方法一样:

1、将要POST到微信服务器的参数除sign外的参数赋值,放到一个数组array里面,按照字典顺序排序,其实在PHP中就是用ksort排序。

2、将数组转换成字符串string,格式为 k1=v1&k2=v2&...kN=vN

3、在此string后加上KEY值(在微信支付商户后台用户自己设定的)现在string = k1=v1&k2=v2&...kN=vN&key=KEY。

4、string = md5(string)

5、sign = strtoupper(string)

签名方式都是这样

签名还有一个坑就是看上面的代码25行。在js中时间戳这样写timestamp,后端(php端)中就要求timeStamp这样写。

对此我只想对腾讯说

100966528_1.jpg

其他还有一堆问题比如官方注释写错等我就不一一列举了,毕竟跟上面那些坑比比这都不是问题。

支付授权目录问题

最后还是有个问题是我想问问大家有没有碰到的,我是在是想不通啥子逻辑。我觉得是微信支付授权目录有问题。我的情况是这样的:

前一天下午我发起支付的页面是域名/abc/def/pay.php。测试目录我写的是域名/abc/

下午好用,晚上给老板测试支付就不好用了,提示的大体意思就是支付授权目录不对,我仔细一检查还真不对,应该是域名/abc/def/

但是把测试目录改正确后再把真正的支付授权目录改成注目礼后并且把微信号加入白名单还是不行。正当我纳闷中半小时后又支付可以了

第二天我再测试官方DEMO。竟然放在域名下任何一个文件夹都能正常支付。不管目录有没有授权。我从白名单把我删除在我的测试目录下的支付中也是成功的。直到我取消关注公众号再关注这时提示不在白名单。

其实上面可以汇成一个句话的问题:为什么支付授权目录一会管用一会不管用呢?求高手回复讨论。

补充:

最后一个问题已经解决,今天狠狠心,跟老板用了三个微信挨个测试。得到的答案是:微信端或者换支付目录或者白名单时腾讯服务器有缓存。会过一会生效。我测试都是三分钟后生效。几分钟不生效可以:重登微信、重新关注公众号。基本可以解决。

还有就是,千万不要在别的公众号测试自己的支付代码。

100966528_2.jpg

我测试自己的支付代码对错一直是把地址发送到微信支付的官方服务号,然后点进去测试。就出现支付授权目录设不设置都可以支付。而且我TM用内网访问竟然也能支付成功。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值