本次demo使用的是tp框架,并且下载了微信官方提供的演示demo,并对微信演示demo的部分代码进行了重构。
微信支付官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
搭建好环境后,下面就开始接入微信支付啦
- 在接入之前我们需要配置以下项:
微信公众号:appid、secret、授权域名
微信商户:支付目录、商户Key - 业务流程(后端)
第一步:获取用户的openid(JSAPI才会用到)
第二步:提交微信创建订单
第三步:微信支付异步通知
第四步:手动查询订单 - 常见错误提示
配置项详解:
> 支付目录配置:
注意点:在微信商户平台里面设置,不是在微信公众平台,支付目录现已支持配置到网站根目录,另外注意区分是http还是https协议
> 授权域名配置:
注意点:JSAPI支付必传openid,将下载的文件放到网站根目录即可
业务流程详解:
> 第一步:获取用户的openid [官方文档]
1.第一步:用户同意授权,获取code(有几种授权模式,这里采用snsapi_base的模式,具体区别自行阅读官方文档)
在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(已认证服务号,默认拥有 scope 参数中的snsapi_base和snsapi_userinfo 权限),引导关注者打开如下页面:
https://open.weixin.qq.com/connect/oauth2/authorizeappid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
参数说明:
2.第二步:通过 code 换取网页授权access_token
首先请注意,这里通过 code 换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
获取 code 后,请求以下链接获取access_token:
GET:https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数说明:
返回说明:
正确时返回的 JSON 数据包如下:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
错误时微信会返回 JSON 数据包如下(示例为 Code 无效错误):
{
"errcode":40029,
"errmsg":"invalid code"
}
通过以上两个步骤就可以拿到用户的openid,下面就进入正式的创建订单环节
> 第二步:创建订单
业务流程:可参考微信官方的业务流程图,核心流程如下图所示:
注意事项:
- 1.用户进行支付操作后,微信会异步通知商户系统的回调域名,回调域名在请求下单接口时通过notify_url参数指定,notify_url异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 公网域名必须为https,如果是走专线接入,使用专线NAT IP或者私有回调域名可使用http,示例值:https://www.weixin.qq.com/wxpay/pay.php
- 2.商户系统在接收到微信异步通知后可以调用查询订单接口查询订单状态,然后进行入帐或其他处理
- 3.商户系统要在回调里面做好防重复处理,避免重复入帐造成资金混乱
微信JSAPI支付常用API文档链接: