1、微信扫码支付申请
微信扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。
申请步骤:
第一步:注册公众号(类型须为:服务号)
请根据营业执照类型选择以下主体注册。
第二步:认证公众号
公众号认证后才可申请微信支付,认证费:300元/次。
第三步:提交资料申请微信支付
登录公众平台,点击左侧菜单【微信支付】,开始填写资料等待审核,审核时间为1-5个工作日内。
第四步:开户成功,登录商户平台进行验证
资料审核通过后,请登录联系人邮箱查收商户号和密码,并登录商户平台填写财付通备付金打的小额资金数额,完成账户验证。
第五步:在线签署协议
本协议为线上电子协议,签署后方可进行交易及资金结算,签署完立即生效。
2、 开发文档
在线微信支付开发文档:
https://pay.weixin.qq.com/wiki/doc/api/index.html
1、点Native支付,查看文档
2、选择"扫码支付->开发指引"菜单
-
商户后台系统:即我们开发的系统
-
微信支付系统:微信支付平台
3、时序图如下
关注点
1. 生成支付二维码
-
商户生成订单
-
商户调用微信下单接口,获取预交易的链接
-
商户将链接生成二维码图片,展示给用户
2. 收到支付结果通知
-
微信通知商户支付结果,商户告知微信支付接收情况
-
商户如果没有收到通知,可以调用接口,查询支付状态
-
如果支付成功则发货,并且修改订单状态
3、接下来,我们需要做的是
-
调用微信下单接口,生成链接。
-
根据链接生成二维码图片
-
接受微信支付的结果
-
支付成功后修改订单状态
4、 API
统一下单
请求路径
-
请求方式:POST请求
请求参数
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
公众账号ID | appid | 是 | String(32) | wxd678efh56 | 微信支付分配的公众账号ID |
商户号 | mch_id | 是 | String(32) | 1230000109 | 微信支付分配的商户号 |
随机字符串 | nonce_str | 是 | String(32) | 5K8264ILT | 随机字符串,长度要求在32位以内 |
签名 | sign | 是 | String(32) | C380BEC2B | 通过签名算法计算得出的签名值 |
商品描述 | body | 是 | String(128) | 娃娃 | 商品简单描述 |
商户订单号 | out_trade_no | 是 | String(32) | 20150806125 | 商户系统内部订单号 |
标价金额 | total_fee | 是 | Int | 88 | 订单总金额,单位为分 |
终端IP | spbill_create_ip | 是 | String(16) | 123.12.12.123 | APP和网页支付提交用户端IP,Native支付填调用微信支付API的机器IP。 |
通知地址 | notify_url | 是 | String(256) | http://www.weixin.qq.com/wxpay/pay.php | 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 |
交易类型 | trade_type | 是 | String(16) | NATIVE | JSAPI 公众号支付;NATIVE 扫码支付 |
这些参数大致分成3类
-
商家自己的信息或固定数据,可以提前配置,无需每次请求单独配置统一设置好即可。
-
appid:微信支付分配的公众账号ID
-
mch_id:微信支付分配的商户号
-
spbill_create_ip:提交用户端IP
-
notify_url:异步接收微信支付结果通知的回调地址
-
trade_type:支付类型
-
-
为了保证数据安全而添加的验证数据,根据算法去生成,每次请求自动生成即可
-
nonce_str:随机字符串
-
sign:签名算法计算得出的签名值
-
-
订单相关信息,需要我们自己填写
-
body:商品简单描述
-
out_trade_no:商户系统内部订单号
-
total_fee:订单总金额,单位为分
-
2.3.2 支付结果通知
支付完成后,微信会把相关支付结果和用户信息发送给商户(我们的程序),商户需要接收处理,并返回应答。
微信服务会自动向notify_url
地址发起POST请求:
通信成功,微信会返回下面信息
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
商户订单号 | out_trade_no | 是 | String(32) | 44642109e5 | 商户系统内部订单号,要求32个字符内 |
业务结果 | result_code | 是 | String(16) | SUCCESS | SUCCESS/FAIL |
我们需要返回给微信的参数
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
返回状态码 | return_code | 是 | String(16) | SUCCESS | SUCCESS/FAIL此字段是通信标识,非交易标识,交易是否成功需要查看trade_state来判断 |
返回信息 | return_msg | 是 | String(128) | OK | 当return_code为FAIL时返回信息为错误原因 ,例如签名失败参数格式校验错误 |
以XML的格式返回
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>
5、SDK
虽然请求参数比较复杂,但官方已经提供了SDK,供我们使用;