wechat pay

接口说明

接口调用规则

  • 讣证方式:HTTPS 讣证,退款和冲正接口调用需要商户证书(证书在审核邮件附件中)
  • 请求采用 POST 方式
  • 提交和返回结果采用 XML 格式
  • 字符集默讣使用 UTF-8,请勿使用其它字符集
  • 商户不微信之间的交互(特别是 Native 回调和支付通知回调),都需要验证签名
  • 处理返回时先判断协议返回错误码,再判断业务返回错误码,最后判断交易状态

Sign 签名生成方法

微信支付中将对数据里面的内容进行鉴权,确定携带的信息是真实、有效、合理的。因此,这里将定义生成 sign 字符串的方法。

  1. 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式(即 key1=value1&key2=value2...)拼接成字符串 string1,注意:值为空的参数丌参不签名;
  2. 在 string1 最 后 拼 接 上 key=Key( 商 户 支 付 密 钥 ) 得 到 stringSignTemp 字 符 串 , 幵对stringSignTemp 进行 md5 运算,再将得到的字符串所有字符转换为大写,得到 sign 值 signValue。

下面定义了一段生成 sign 字符串的示范过程:

假设以下为 package 传入参数:

appid=wxd930ea5d5a258f4f
auth_code=123456
body=test
device_info=123
mch_id=1900000109
nonce_str=960f228109051b9969f76c82bde183ac
out_trade_no=1400755861
spbill_create_ip=127.0.0.1
total_fee=1
key=8934e7d15453e97507ef794cf7b0519d
  1. 经过 a 过程 URL 键值对字典序排序后的字符串 string1 为:
    appid=wxd930ea5d5a258f4f&auth_code=123456&body=test&device_info=123&mch_id=1
    900000109&nonce_str=960f228109051b9969f76c82bde183ac&out_trade_no=1400755861&spbil
    l_create_ip=127.0.0.1&total_fee=1
    
  2. 经过 b 过程后得到 sign 为:
    sign=md5(string1&key=8934e7d15453e97507ef794cf7b0519d).toUpperCase=md5(appid=wxd930ea5d5a258f4f&auth_code=123456&body=test&device_info=123&mch_id=1900000109&nonce_str=960f228109051b9969f76c82bde183ac&out_trade_no=1400755861&spbill_create_ip=127.0.0.1&total_fee=1&key=8934e7d15453e97507ef794cf7b0519d).toUpperCase()="c380bec2bfd727a4b6845133519f3ad6".toUpperCase()="C380BEC2BFD727A4B6845133519F3AD6"
    

代码实例

接口调用实例,以开収为例说明数据提交和返回的具体格式:

提交数据:

<xml>
<appid>wx2421b1c4370ec43b</appid>
<attach><![CDATA[att1]]></attach>
<body><![CDATA[JSAPI 支付测试]]></body>
<device_info>1000</device_info>
<mch_id>10000100</mch_id>
<nonce_str>b927722419c52622651a871d1d9ed8b2</nonce_str>
<notify_url>http://wxpay.weixin.qq.com/pub_v2/pay/notify.php</notify_url>
<out_trade_no>1405713376</out_trade_no>
<spbill_create_ip>127.0.0.1</spbill_create_ip>
<total_fee>1</total_fee>
<trade_type>JSAPI</trade_type>
<sign><![CDATA[3CA89B5870F944736C657979192E1CF4]]></sign>
</xml>

协议级错误返回:

<xml>
<return_code><![CDATA[FAIL ]]></return_code>
<return_msg><![CDATA[SYSERR]]></return_msg>
</xml>

正确返回数据:

<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<mch_id><![CDATA[10000100]]></mch_id>
<device_info><![CDATA[1000]]></device_info>
<nonce_str><![CDATA[FvYSnPuFFPkAr77M]]></nonce_str>
<sign><![CDATA[63238039D6E43634297CF2A6EB5F3B72]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<openid><![CDATA[oUpF8uN95-Ptaags6E_roPHg7AG0]]></openid>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<trade_type><![CDATA[JSAPI]]></trade_type>
<bank_type><![CDATA[CCB_CREDIT]]></bank_type>
<total_fee>1</total_fee>
<coupon_fee>0</coupon_fee>
<fee_type><![CDATA[CNY]]></fee_type>
<transaction_id><![CDATA[1008450740201407220000058756]]></transaction_id>
<out_trade_no><![CDATA[1406033828]]></out_trade_no>
<attach><![CDATA[att]]></attach>
<time_end><![CDATA[20140722160655]]></time_end>
</xml>

业务级错误返回:

<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<mch_id><![CDATA[10000100]]></mch_id>
<device_info><![CDATA[1000]]></device_info>
<nonce_str><![CDATA[sthBJ9QyUG6vkrjJ]]></nonce_str>
<sign><![CDATA[6277A96D7875D4FF23AA7B6A4C3046AB]]></sign>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[PAYERROR]]></err_code>
<err_code_des><![CDATA[支付错误]]></err_code_des>
</xml>