那些年对接微信支付踩过的坑

1.对接微信支付之前首先就得需要申请微信支付,可以通过实名认证的公众号或者其他方式,不过申请的不走很繁琐,需要提供的材料很多而且申请周期为48小时,且会有很多审核失败,不过你可以按照要求一步一步修改内容,基本上审核微信支付需要花个一周时间;审核过后你会收到邮件拿到一些商户id等信息;

2.必须得有一个已经备案过的域名;

3.登入商户中心,开通一些产品功能,例如h5支付等,然后配置api密钥即支付对接中key;

4.然后配置好相关的支付回调,例如h5回调,web回调,公众回调等;

5.仔细阅读官方文档后,发现微信的公众号支付必须传入openid;所有这里涉及到在登录时对openid的保存,因为openid只有在登录时获取accesstoken的时候才有;这里说到openid时,不得不提一下unionid,unionid必须在申请微信开放平台后,并且将公众号绑定上去才有,所以如果公司有web应用,app应用,公众号,小程序的话,千万要记得去打通,也就是申请开放平台(费用300);

6.配置公众号的网页授权地址,这里有一个坑,这个授权地址必须是审核过的域名且走80端口或者443端口,然后在你的应用里面必须得有一个接口然后接受微信的请求,这个接口也就是你需要在公众号基本配置中配置的服务器url地址,令牌token可以随便自己填,当然后面接口里面用到的token值必须与这个值一样;

7.之前全部准备完成后以后,接下去就可以利用微信给的sdk来对接微信支付了

        查找官方文档寻找sdk,作为java程序员习惯性的寻找maven导入配置,然后并没有发现,只能下载sdk,然后我打算将源码打成jar包然后上传到本地的私服库,然后用maven来导入,试了以后,准备开始继承WXPayConfig类实现自己的配置;发现怎么都没法找到抽象类中定义的方法,回去查看发现这些方法的权限级别是protected,然后我就只能乖乖的将源码导入到项目中进行开发;

    第二个坑,IWXPayDomain这个接口没有默认的实现,需要我们自己去实现他的report方法,然后该方法上的注释写着是“上报域名网络状况”,我下意识的认为这里会将我们调用微信的域名网络状况上报给微信,但是我找了一下源码中已经有别的地方再上报网络状况了,所以认为这里绝对不是这个意思,然后查看常量类里面有两个域名,看到接口上的注释是“域名管理,实现主备域名自动切换”,然后我去百度了一下,发现这里是在做检查域名的网络状况,每次请求都再本地缓存中记录下这个域名的请求成功次数,失败次数等信息,然后通过这些值来比较获取网络更好的域名。所以该方法的注释信息应该是“检查域名网络状况,自动切换”;

    第三个坑,WXPayConfig类默认是开启上报网络状况的,并且是启动了6个线程,批量上报,每次上报10条,这里内部是通过一个LinkedBlockingQueue来作为队列存储上报信息,每次请求接口都讲域名状况信息存入该队列中,然后启动异步线程往这个队列中去取数据,这个队里的大小默认设置为10000。官方解释“健康上报缓存消息的最大数量。会有线程去独立上报, 粗略计算:加入一条消息200B,10000消息占用空间 2000 KB,约为2MB,可以接受”,如果内存溢出或者程序崩溃以及优化性能时可以检查一下这里。

    第四个坑,在利用微信沙箱环境测试的时候,发现用之前配置的key无法请求unifiedOrder接口,报错提示是请使用沙箱环境密钥,官方文档中的最佳实践验收指引里面有提醒道,需要用之前配置的key去请求“https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey”接口,获取沙箱密钥。

    第五个坑,获取到沙箱key后,更改配置文件中原来配置的key(记住保存好原来的key),然后开始测试接口,发现传入任意的金额的话,会给你报错好像是什么沙箱金额错误来着,再去查看一下官方文档发现似乎必须根据验收case中的值传入来调试,金额传入330以后正常;

    第六个坑,统一下单后发现,微信那边始终无法回调到我在下单时配置的通知接口,根据官方文档给的是接口必须不携带参数,但是没有明确说明请求方式是什么。因为我们网站用的是https,所以我不管是用了get方式还是post方式,微信那边始终都没有回调到我的接口,后来百度了好久,问了同事,同事也一起帮着百度,大概花了一个下午的时间,发现这个配置的通知接口必须是post方式且为http请求。更改后,发现终于能回调进来了,然后我在接口中添加个string类型的参数,再加上注解@RequestBody,在测试,发现参数是能够拿到的(这里就开始想骂腾讯了,出的都是些什么文档啊,到处留坑);

第七个坑,这里做完以上内容后,感觉基本上微信支付这一块是没有坑了,然后去看了下微信的h5支付,因为发现验收case里面并没有关于h5支付的内容,但是官方又有h5支付的文档,所以很奇怪,我试着设置tradeType为“MWEB”,然后在返回参数中拿到“mweb_url”的值,通过手机去访问,正常情况下,应该是唤起微信app中的支付,但是好像并没有这样的效果,后来又去查找百度,看看广大网友是怎么解决的,发现好多人是直接通过正式环境去测试的,后来又看了一些网友对微信沙箱环境的说明,(这真的是什么鬼的沙箱环境啊),和正式环境都不一样,这到时候怎么还放心上线使用啊。

目前为止,我踩坑只踩到这里,希望大家有关更多微信支付的坑的话可以一起交流交流。    

你可能感兴趣的:(那些年对接微信支付踩过的坑)