开发微信支付功能,遇到一些很难被发现的坑,在此记录,以防后患。

公众号支付的场景

商户已有H5商品页面,用户可以通过点击商城的购买链接或是扫二维码在微信客户端打开网页,从而进行支付。

微信支付商户平台设置

支付授权目录配置

登录微信支付商户平台,进入目录产品中心-开发配置-支付配置,在支付授权目录添加支付页面的目录。即:若支付页面为https://domain.com/pay/pay.html,则需要将https://domain.com/pay/添加到JSAPI支付授权目录下。

支付API证书及密钥配置

部分API(如退款)的调用需要通过证书来确定调用者的身份,不涉及则可以不用设置。

如需配置,则需下载证书并放置到服务器安全目录,在调用相关接口时读取证书并使用,使用方法参考微信支付DEMO

微信公众号设置

在H5页面进行支付时需要获取用户基本信息,因此还需在公众平台账户设置网页授权域名。登录微信公众号,公众号设置-功能设置-网页授权域名,添加测试或正式环境的域名;下载验证文件(类似MPverify.txt)并放置到服务器目录下。*注意:该域名一个月内仅可修改3次,因此千万不要随便设置,以免影响开发

支付流程及参数

公众号支付大部分流程在服务器端进行,H5页面仅需发起下单请求和支付请求就可以了。服务端请求统一下单API,成功调用后由返回的参数中获取预支付IDprepay_id,并生成支付参数返回给H5。参数格式参照公众号支付参数说明注意:所有接口的参数都是大小写敏感的,因此最好拷贝各个参数而不是手动敲代码

支付的流程如下:

微信支付流程图

隐藏的坑:

  1. 若签名失败,则在签名校验地址校验调用相关API的参数生成的签名是否正确

  2. 统一下单的接口中需要签名,返回给H5的支付参数中也有签名,两个签名的签名方式必须统一

  • JS支付接口getBrandWCPayRequest仅支持MD5签名,所以统一下单接口必须使用MD5进行签名。

  • 若使用JSAPI中的接口WeixinJSBridge进行支付,则默认为SHA1,而新版的微信支付使用的是MD5。因此综上所述,建议所有签名用MD5

第二个坑摸索了一天一夜,最终还是通过发邮件给微信的人才搞定。通过签名接口校验所有的签名都是校验通过,但是调起支付后还是通知签名失败,建议他们修改文档,然而没有卵用,依然没有任何提示。就这样吧,踩坑愉快!