微信支付
搞完了微信支付,心里那个如释重负啊,太坑爹了,随便一个,都能让你欲哭无泪,做一下记录,也给后来的小伙伴们参考,同时发发牢骚。
第一坑:
微信下单的时候,会要求传入body,文档要求body不能超过127个字,但是有一点,官方文档中没有说明,一定不能出现特俗字符,不然你会死的很惨
第二坑:
生成微信的signature
小伙伴们一定要注意了,在微信下单完成后获取到prepay_id的时候,这个时候加密的参数timeStamp,中间的参数一定是大写的,因为在js调用微信支付的时候,这个破东西又成了timestamp,中间的s有时候小写的了,相信做过的,很多人死在这上面
第三坑:
最后js调用微信支付的时候,就看见微信一闪而过,就是调用不起来,打开js中的debug,你会看到{“errorMsg”:"chooseWXPay:fail"},微信并没有给出明确提示,到底是哪里的问题,本人遇到过两种:
1. 公众号里面开发配置错误,需要配置到微信支付目录最下层,并不是项目目录,比如我们的项目访问路径是
我的支付路径是
这里就必须配置
包括下面的回调域也是一样的。这也是大多数人遇到过得问题
2. 也是报同样的错误,但是由于我们有多个公众号,最后支付的时候,我用的另外一个公众号(没认证),点击去也同样报这个错误,这里需要友情提示一下,最后配置的appid这些是哪个公众号,就必须要在那个公众号中打开支付才能成功
跨号支付指的是从一个公众号(包括服务号和订阅号)转发或复制支付链接到另一个公众号进行支付时,这两个公众号中有至少一个公众号是未认证的情况,目前这种情况下是被限制进行支付的,会提示“不允许跨号支付”
第四坑:
微信支付有支付成功的回路径,PC的扫码登录也有回调,有没有小伙伴遇到过支付或者扫码登录怎么都不回调呢。是因为这俩回调有区别,微信支付的回调是不需要urlencoder,PC扫码登录就需要urlencoder,和第二坑中的timestamp一样,如果哪位小伙伴不小心掉进去了,翻翻文档其实也不难找到。我就想问问腾讯,统一一下就这么难吗
其他的暂时不记得了,先写这么些给有缘人做参考,后续能想到再补上。。。
微信卡券
最近在搞微信卡券,感觉还是腾讯的风格,一如既往的坑
微信卡券管理
1. 查看卡券详情
返回数据的json格式一大堆,但是偏偏文档描述又不全,然后就需要我们自己一个个对,一个个猜是些什么意思,当初做的时候,我真的时候骂了写着文 档的人千万遍,特别是看到这一块文档底部有这么一句:开发时对于不理解的字段不做处理,以免出错。
当初我找封面那个字段,找了半天没有找到,最后还是通过比对数据才知道,该死的封面原来是“abstract”
微信卡券的发放
微信提供了微信根据openid群发、客服消息发送、jssdk领取等方式,我们需要搞活动,然后将卡券直接发放给用户,我的第一想法,就是通过openid直接发放给用户,然后就开始了漫长的坑坑洼洼的道路
1. 根据openid群发消息,如果你连续发送几条,你会发现,你的微信上只能收到一条,但是管理员的微信上会收到多个发送成功的消息,然后我理所当然选择客服消息发送;
2. 改变接口后,上面的问题解决了,又发现另一个问题,发送出去的消息,用户能重复点进去领取,一直领取到卡券设置的每人最大领取限度为止,我又蒙了,微信没有明确说明,我一直以为每一条消息只能领取一次,这地方微信加一个限制,感觉很容易啊。没办法,再次改变方向,jssdk发放,由自己来控制发放数量;
3. 这下好了,方向对了,代码也很快写好了,但是这一调试,我去,一整天没了,也怪自己有些粗心,具体过程如下:
jssdk批量添加卡券接口坑:
这个批量添加卡券,我当时看到还以为是给商户用的呢,后来看了才知道,就是发放卡券
第一坑:
cardExt中的api_ticket,我只能说,一不小心你就受伤了,也怪我没有注意看他的说明,直接就认为是jssdk中的jsapi_ticket,然后我就开始了无休止的调试,无休止的签名错误,最后把参数打印出来,打开微信的在线调试工具,把自己的ticket粘贴进去,调试工具直接提示有误我才把注意力集中在这里,才发现这个问题,微信jssdk卡券发放的api_ticket需要调用单独的接口来获取,说是历史原因,我只能无语。。。
第二坑:
轮到cardExt了,批量添加卡券接口接口中微信有这么一句话:这里的“card_ext参数必须与参与签名的参数一致,格式为字符串而不是Object”,当时我心里就打鼓了,这意思到底是值必须和加密的时候一样呢还是所有参数都必须一样呢,为了开发速度,我直接将之前加密的代码复制了一份,然后获取ticket的地方改了一下,签名错误,然后继续查找代码问题,又发现微信的命名问题,其他接口加密随机字符串的名称是“noncestr”,但是到了这里,怎么又成了“nonce_str”,腾讯的代码规范真不敢恭维
第三坑:
这也是一个需要细心的地方,因为其他接口加密的时候,都是将所有字段的key排序过后拼接成链接参数形式的字符串,而这里加密是将所有参数的值排序后直接拼接在一起,一定不要要字段名称,这里我差点就陷进去了,哎,我是一个粗心的小伙伴儿啊
然后我就在cardExt这里到底是和签名时候用的字段和值完全一致,还是只是需要一致上纠结徘徊,一遍遍尝试,终于得出结果:需要
另外,友情提醒一下看到这里的小伙伴,该接口中的cardExt是json形式的字符串,如果没有将卡券扩展字段cardExt加密,说明下面的那句话看到,直接只是看了接口和参数,相信会有人看到微信那句“格式为字符串而不是Object”,可能会想到和jssdk加密方式一样拼接成链接参数形式的字符串,或者卡券加密时候的那种字符串,那你就入坑了