微信支付

创建微信支付


本API创建一个微信支付, 并返回相应的 payment_id.

请求: (POST)//weixin_account/payments

参数

Name Type Required Description
weixin_account_id int Y 微信之门添加微信公众号后 生成的ID
token string Y wgate token
sign string Y 参数签名, 签名方式见 签名及校验方法
body string Y 商品或支付单简要描述
detail string Y 商品详细列表, 格式同微信支付同档
attach string Y 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
out_trade_no string Y 商户系统内部的订单号,32个字符内、可包含字母
fee_type string Y 符合ISO 4217标准的三位字母代码,默认人民币:CNY
total_fee string Y 订单总金额,单位为分
spbill_create_ip string Y APP和网页支付提交用户端ip
time_start string Y 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010
time_expire string Y 订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010
goods_tag string Y 商品标记,代金券或立减优惠功能的参数
product_id string Y 此id为二维码中包含的商品ID,商户自行定义
limit_pay string Y no_credit--指定不能使用信用卡支付
openid string Y 用户在商户appid下的唯一标识
notify_url string Y 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数
user_back_url string Y 用户在支付网关完成操作后跳转回页面url

以上参数 红色标记 的参数, 均与微信官方参数完全一致, 原样传递, 详情请见 微信支付-统一下单API.

notify_url 参数必须是外网可访问到的地址, 在内网开发测试时, 可做外网端口映射, 或者类似 ngrok 这样的工具.

返回值

 {"payment_id":"xxx"}

调用频率

10000次/每天

请求实例


http://api.weixingate.com/v1/weixin_account/payments

返回字段说明

Name Description
payment_id 创建的支付ID,将在30分钟内有效

微信支付网关


生成 payment_id 后, 需跳转到微信之门的微信支付网关, 进行支付操作.

请求: HTTP 302跳转

(GET) http://www.weixingate.com/members/wx/pays/[payment_id]

参数

Name Type Required Description
payment_id int Y payment id, 通过 创建微信支付 接口生成

返回值

用户在该页面支付完成后, 将面将跳转回 创建支付接口 "user_back_url" 参数设定的 url. 返回时不带参数, 此页面需根据 notify_url 得到的支付状态显示页面, 如果还没有支付状态返回, 可显示等待页面并自动刷新.

调用频率

10000次/每天

请求实例


http://www.weixingate.com/members/wx/pays/1455527413224


返回字段说明

微信支付成功通知


当用户完成支付时, 服务器后端会发送一个通知请求, 到 notify_url, 返回所有相关的支付参数.

请请求是微信之门得到微信端通知后, 结合微信之门相关参数封装而成. 大部分参数为微信端直传.

应用服务器在收到此请求后, 需返回指定格式表示成功的XML, 如果服务器未收到XML返回, 或者连接失败, 会在相应的时间间隔后重试. (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)

收到通知后, 需要对参数进行签字校验, 以防请求的伪造.

通知字段说明

以下参数 红色标记 的参数, 为微信端直接传递, 详情请见 微信支付开发文档-支付结果通用通知

Name Type Required Description
weixin_account_id int Y 微信之门添加微信公众号后 生成的ID
payment_id int Y payment id, 通过 创建微信支付 接口生成
sign int Y 请求参数签名, 签名方式见 签名及校验方法
return_code string Y 见微信支付文档
return_msg string N 见微信支付文档
appid string Y 见微信支付文档
device_info string Y 见微信支付文档
nonce_str string Y 见微信支付文档
result_code string Y 见微信支付文档
err_code string Y 见微信支付文档
err_code_des string Y 见微信支付文档
openid string Y 见微信支付文档
is_subscribe string N 见微信支付文档
trade_type string Y 见微信支付文档
openid string Y 见微信支付文档
is_subscribe string Y 见微信支付文档
trade_type string Y 见微信支付文档
bank_type string Y 见微信支付文档
total_fee string Y 见微信支付文档
settlement_total_fee string N 见微信支付文档
fee_type string N 见微信支付文档
cash_fee string Y 见微信支付文档
cash_fee_type string N 见微信支付文档
coupon_fee string N 见微信支付文档
coupon_count string N 见微信支付文档
coupon_type_$n string N 见微信支付文档
coupon_id_$n string N 见微信支付文档
coupon_fee_$n string N 见微信支付文档
transaction_id string Y 见微信支付文档
out_trade_no string Y 见微信支付文档
attach string N 见微信支付文档
time_end string Y 见微信支付文档

返回内容

应用服务器收到微信之门通知HTTP请求后, 需返回此XML表示已成功收到消息. 否则服务器会重新发送通知消息.

<xml>
  <return_code><![CDATA[SUCCESS]]></return_code>
  <return_msg><![CDATA[OK]]></return_msg>
</xml>

签名及校验方法

签名生成的步骤如下:

第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:

  • 参数名ASCII码从小到大排序(字典序);
  • 如果参数的值为空不参与签名;
  • 参数名区分大小写;
  • sign参数不参与签名,将生成的签名与该sign值作校验。
  • 微信接口可能增加字段,验证签名时必须支持增加的扩展字段

第二步,在stringA最后拼接上 &secret=wget secret (wgate secret 为创建Wgate KEY对应的secret)得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

举例:

假设传送的参数如下:

appid:  wxd930ea5d5a258f4f
mch_id: 10000100
device_info:  1000
body: test
nonce_str:  ibuaiVcKdpRxkhJA

第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:

stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";

第二步:拼接API密钥:

stringSignTemp="stringA&secret=[wgate secret]"
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7"

最终校验得到的 sign 与 参数中的 sign是否相同. 不同则说明数据有异常.