微信支付的那些事
微信支付分为刷卡支付、公众号支付、扫码支付和app支付,另外还有小程序支付和wap支付,关于wap支付,据说2016年就对外开放,不过至今还是没有消息,只有京东等微信的合作伙伴可以使用。
刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。
扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。
公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。
APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。
小程序支付,是商户在微信小程序平台内实现支付功能。
wap支付是指在手机微信浏览器外实现支付功能。
首先指出的是app支付应该在微信开放平台进行申请,一个平台可以申请十个app支付,申请开发者资质认证需要支付300元费用,其他平台在微信公众平台申请,申请微信支付不要钱,但是需要公众号认证,认证费300元。
下面我就以公众号支付(h5支付)为案例,介绍开发微信支付的整个流程。
1、申请微信公众号(服务号),然后再平台内申请微信支付。申请完成后微信官方会给你一个微信商户平台,他是微信支付相关的商户功能集合,包括参数配置、支付数据查询与统计、在线退款、代金券或立减优惠运营等功能。
2、申请内外网映射,这里推荐两个花生壳和ngrok两个工具可以任选其一,这样可以本地可以内外网调试。
3、在微信公众平台设置您的公众号支付支付目录(刚开始是测试目录),设置支付白名单(我记得15年有这个支付白名单,不知道现在还有没有),在接口权限中配置微信网页授权,这里主要是为了获取微信的openid。
4、下面就开始开发了
第一步就是获取openid,参考https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_4.
第二步 获取签名
具体可以参考https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
参与签名的字段为下面统一下单的除了sign的所有的参数然后再加上商户key,商户key的获取方法为:在商户后台配置的一个32位的key,微信商户平台-账户设置-安全设置-api安全。
第三步 统一下单
通过下列参数拼接成xml格式发送到https://api.mch.weixin.qq.com/pay/unifiedorder 即可获得预支付订单,下面这些参数都是必填参数。
|
变量名 |
字段名 |
描述 |
|
appid |
公众账号ID |
微信支付分配的公众账号ID,在微信公众号中的基本配置中查看 |
|
mch_id |
商户号 |
微信支付分配的商户号 |
|
nonce_str |
随机字符串 |
随机字符串,长度要求在32位以内。 |
|
sign |
签名 |
参考第二步 |
|
body |
商品描述 |
规则:店名+销售商品类目 |
|
out_trade_no |
商户订单号 |
商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一 |
|
total_fee |
标价金额 |
订单总金额,标价为分 |
|
spbill_create_ip |
终端ip |
可固定写死,也可以获取真实ip,格式要对 |
|
notify_url |
异步回调地址 |
异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 |
|
trade_type |
交易类型 |
JSAPI |
|
openid |
用户标识 |
通过自动默认授权登录既可以获取到,也可以使用数据库之前读取的,但是要保证是appid下的openid |
第四步 通过统一下单可以获取到预支付id,如果没有获取到预支付id,参数没有出错的话,有可能就是订单号重复,这个时候就需要重新生成订单号。
然后就可以调用签名,具体可以参考https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3,参与签名的字段为下面统一下单的除了sign的所有的参数然后再加上商户key
第五步 调起支付参数
|
变量名 |
字段名 |
描述 |
|
appid |
公众账号ID |
微信支付分配的公众账号ID,在微信公众号中的基本配置中查看 |
|
nonce_str |
随机字符串 |
上面统一下单的随机字符串即可 |
|
timeStamp |
时间戳 |
当前的时间,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数。 |
|
package |
订单详情扩展字符串 |
统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=*** |
|
signType |
签名算法 |
固定为MD5 |
|
paySign |
签名 |
参考第四步 |
第六步 调起支付
目前有两种调起支付方式,第一种是微信内H5调起支付(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6),即通过WeixinJSBridge对象调起支付,第二种是通过JS-SDK调起支付(https://mp.weixin.qq.com/wiki),第一种方式适合快速开发,不需要开发过微信公众号的经验即可完成开发,第二种是需要一定的微信公众号的开发经验。
以上就是一个微信支付的大致开发流程,当然这个开发是很简单,下面我们聊聊开发中的那些坑。
1、你是不是遇到过在开发中遇到过在微信给的签名验证工具中签名验证是和你本地签名是一致的,但是在调起支付的时候会显示签名错误的问题,这个问题百分之九十的人会遇到,这个就是你参加签名的参数的问题了,仔细检查参加签名的参数,基本上都会找到问题,当然我还遇到了更奇葩的问题,就是本地测试可以通过,到线上就会报签名错误,这个可能就和你的服务器配置的问题有一定的关系了,你可以通过将一些参数写死,来验证这些错误。
2、微信支付一闪而过,当遇到这个问题的时候感觉离成功就差一步,但是死活就是不行,遇到这个问题时候,就要看微信公众平台的公众号支付目录是否正确,如果是测试目录则需要将微信号加入白名单,当然我还这样解决过一个问题,就是签名方法出错(即商户key没有参加签名)
3、苹果手机可以调起支付,但是安卓手机不能调起支付,这个问题遇到的人比较少,我最终查看原因为安卓手机发起的支付都获取到了两个Ip地址,这个时候把获取ip地址的方法处理一下即可。
处理微信支付问题的小技巧
1、当打印出返回错误的时候,苹果手机返回的错误信息会比安卓手机返回的信息多一点。可以多用苹果手机测试。
2、出现错误解决不了,尽量最少的参数参加签名,然后一点点排除
3、你不知道的错误解决地址http://kf.qq.com/faq/140225MveaUz150413VNj6nm.html
4、终极方案,咨询微信支付技术客服,邮箱是wepayTS@tencent.com,当然他有可能不理你,你要通过不同的邮箱不断的给她们发信息就可以了。
5、微信支付demo java版本,里面的方法可以拿出来参考, http://pan.baidu.com/s/1eSotauQ
浙公网安备 33010602011771号