随着微信小程序的发展,越来越多的移动应用选择微信产品作为媒体。无论是微信官方账号开发,还是小程序开发,微信支付始终是一个无法回避的话题。由于微信支付涉及到很多场景,本文只学习如何在微信官方账号和小程序中接入微信支付。
一、微信支付的前提条件1.1 公众号微信官方账号大致可以分为服务号和订阅号。订阅号和服务号的具体区别在之前的一篇文章Spring Boot开发微信微信官方账号中有介绍,在此不再赘述。一般来说,服务号提供的功能更高级。
微信支付接入需要已完成微信认证的服务号。如果是小程序,还需要完成微信认证。
微信官方账号可以关联10个相同主题的小程序和3个不同主题的小程序。如果是与微信官方账号相同题材的小程序,且微信官方账号已经完成认证,可以直接在微信官方账号后台小程序管理中快速注册认证,这样就不需要重复支付300人民币的微信认证费用。
微信认证完成后,将在微信官方账号的微信支付后台启用微信支付功能。提交微信支付申请后,3-5个工作日审核完毕。审核通过后,会有一封包含商户号信息的邮件发送到你填写的邮箱,几毛钱的汇款会发到你填写的企业账户,具体金额需要你核对后在商户平台验证。
商户分为普通商户和服务商。不要申请错了。
普通商人可以交易,但不能拓展。
服务商可以拓展商户,但不能交易。
服务提供商将提供统一的支付门户。它需要绑定特定的普通商户。微信支付时,会在支付接口中携带普通商户参数。付款成功后,金额将直接转入特定普通商户账户。
申请时,直接向普通商户申请即可。
1.3 绑定商户微信支付的推出取决于微信官方账号、小程序和商户号的绑定关系。所以在开发之前,需要将商户与具体的应用进行绑定。
如果要绑定的商户和AppID是同一个主体,只需要以下步骤就可以完成绑定。
如果商家和要绑定的AppID是不同主体,步骤同上,除了输入AppId,还需要填写AppId的认证信息。
1。通过付款代码付款
用户打开微信钱包-支付码接口,商家扫码提交支付。
2。JSAPI支付
用户通过微信扫码、关注微信官方账号等方式进入商家的H5页面,并在微信中调用JSSDK完成支付。
3。本地支付
用户打开微信,扫描商家二维码,完成支付。
4。APP支付
商家在APP中集成微信SDK,用户点击跳转到微信完成支付。
5。H5付款
用户在微信以外的手机浏览器中请求微信支付的场景,唤起了微信支付。
6。小程序支付
用户在微信小程序中使用微信支付的场景。
7。刷脸支付
不需要拿出手机刷脸就能完成支付,适用于各种线下场景。
在商家平台-产品中心-我的产品中申请开通支付产品。
在商家平台-产品中心-开发配置中配置支付授权目录(即你开发的订购接口的地址)。需要注意的是,授权目录最多可以配置个。请在开发过程中合理定义支付接口。
在商户平台-账户中心-API安全中设置API密钥。
第一次设置的时候需要安装操作证,傻瓜式安装,按照提示一步一步来。
API密钥需要一个32位随机字符串。记住不要随意更改API键。
在微信APIv3的版本中,除了配置API key,还需要配置API v3 key,申请CA颁发的API证书。
如果使用开源的微信开发包,请弄清楚是否支持v3版本。
2.4 配置服务器在微信官方账号后台-开发-基础配置-服务器配置中启用并填写服务器信息。
在微信官方账号后台-开发-基本配置-微信官方账号开发信息中配置开发者密钥,填写IP白名单。
在微信官方账号后台-微信官方账号设置-功能设置中设置JS接口安全域名。
以上配置基于微信官方账号支付配置。小程序支付没那么麻烦。小程序支付不需要配置支付授权目录和授权域名。
由于微信升级了API接口,需要在API v3接口加载应用的API证书。微信已经打包了相关的jar包,并提供了加载示例。详见“https://pay . weixin . QQ . com/wiki/doc/API v3/open/pay/chapter 2 _ 3 . shtml”,此处不再赘述。我们以API v2为例,详细研究一下微信接入的主要流程(因为API v3的部分接口还在不断升级,v2接口也比较齐全)。
上图来自微信开发文档,下面详细分析一下支付流程。
3.1 微信下单接口用户通过微信客户端发起支付,在商家后台生成订单,然后调用微信下单接口,生成预付款订单,返回订单号!
对于订购界面中涉及的主要参数,仅列出几个重要参数:
Sign的签名也很常见,涉及一个nonce_str,保证了签名的不可预测性。
拉起微信支付,输入密码,完成支付。这一步需要在H5网页中执行JS催缴。
需要以下参数,所以当预付订单返回和时,需要将以下参数打包后响应页面,页面完成支付。
签约方式与订购界面相同。
JS伪代码如下:
function onBridgeReady(){ weixinsbridge . invoke( & # 39;getBrandWCPayRequest & # 39{ //微信官方账号ID,商家传入 & # 34;appId & # 34:"wx 2421 B1 c 4370 EC 43 b & # 34;, // timestamp,1970年以来的秒数 & # 34;时间戳& # 34;:"1395712654",[/h //随机字符串 & # 34;非核心& # 34;:"e 61463 F8 EFA 94090 B1 f 366 cccfbbb 444 & # 34;, & # 34;套餐& # 34;:"prepay _ id = u 802345 jgfjsdfgsdg 888 & # 34;,[/h //微信签名方式 & # 34;signType & # 34:"MD5 & # 34,[/h //微信签名 & # 34;paySign & # 34:"70ea 570631 E4 bb 79628 fbca 90534 c 63 ff 7 fadd 89 & # 34; }, function(RES){ if(RES . err _ msg = = & # 34;get _ brand _ WC pay _ request:ok & # 34;){ //使用上述方法判断前端返回,微信团队郑重提醒:[/h // res.err_msg在用户支付成功后会返回ok,但不保证绝对可靠。 } }); } if(type of weixinsbridge = = & # 34;未定义& # 34;){ if(document . addevent listener){ document . addevent listener(& # 39;WeixinJSBridgeReady & # 39,onBridgeReady,false); } else if(document . attach event){ document . attach event(& # 39;WeixinJSBridgeReady & # 39,onBridgeReady); document . attach event(& # 39;onWeixinJSBridgeReady & # 39,onBridgeReady); } } else { onBridgeReady(); } 注意伪代码中的这句话// res.err_msg在用户支付成功后会返回ok,但不保证绝对可靠。为什么这么说?我给你举个例子。如果去超市买东西,是不是说付款成功后就可以把东西拿走了?肯定不是。只有商家收到钱,你才能支付成功,然后你才能拿走东西。也就是说,这里的提示成功并不代表支付一定成功。成功与否,微信平台会异步通知。
3.3 异步通知异步通知是一个重要的步骤,您可以根据通知结果处理您的业务逻辑。但由于网络波动等原因,通知可能收不到,或者微信收到的响应不符合API的要求,微信会继续发出多次通知(请在回调通知界面中合理处理,避免重复通知造成的重复业务处理),通知频率为15s/15s/30s/3m/10m/30m/30m,直至成功。但微信并不保证最终通知成功。
异步通知响应参数如下:
微信一直通知你不成功怎么办?刚才也是这个例子。你明明支付成功了,商家却口口声声说她没收到钱。那你会怎么做?肯定是看她手机真的没收到钱!我也是。
3.4 支付状态查询
本文主要以微信官方账号支付为例,总结接入微信支付所需的相关配置和支付流程。其他类似APP支付的支付也是开发中常见的应用场景。APP支付需要在微信开放平台创建应用才能接入微信支付。另外,微信支付API正在平滑升级到v3,部分接口还没有升级。与v2相比,升级后的接口经历了一些数据格式的变化。如果引用第三方开发包进行开发,需要注意接口的对应版本。
参考微信支付开发文档