一、 1004用例-公众号/APP/扫码支付退款
实现免充值代金券接口升级的1004用例PHP函数:
1004用例是公众号/APP/扫码支付退款,
主要有4个步骤:
(1)进行 5.52 元的订单支付;
(2)根据商户内部单号(out_trade_no),调查订单
(3)根据商户内部单号(out_trade_no),调用退款
(4)根据商户内部单号(out_trade_no),调用退款查询
其中1,2跟我们在1003用例中的一样,
//请求退款
public function begReFund($outTradeNo){
$config = array(
'mch_id' => $this->mchid,
'appid' => $this->appid,
'key' => $this->createSandBoxKey(),
);
$refund = array(
'appid' => $config['appid'],
'mch_id' => $config['mch_id'],
'out_trade_no' => $outTradeNo,
'nonce_str' => self::createNonceStr(),
'out_refund_no' => uniqid(),
'total_fee' => 552,
'refund_fee' => 551,
);
$refund['sign'] = self::getSign($refund, $config['key']);
$responseXmlrefund = self::curlPost('https://api.mch.weixin.qq.com/sandboxnew/pay/refund', self::arrayToXml($refund));
$unifiedOrderrefund = simplexml_load_string($responseXmlrefund, 'SimpleXMLElement', LIBXML_NOCDATA);
return $unifiedOrderrefund;
}
//查询退款
public function begReFundquery($outTradeNo){
$config = array(
'mch_id' => $this->mchid,
'appid' => $this->appid,
'key' => $this->createSandBoxKey(),
);
$refundquery = array(
'appid' => $config['appid'],
'mch_id' => $config['mch_id'],
'out_trade_no' => $outTradeNo,
'nonce_str' => self::createNonceStr(),
);
$refundquery['sign'] = self::getSign($refundquery, $config['key']);
$responseXmlrefundquery = self::curlPost('https://api.mch.weixin.qq.com/sandboxnew/pay/refundquery', self::arrayToXml($refundquery));
$unifiedOrderrefundquery = simplexml_load_string($responseXmlrefundquery, 'SimpleXMLElement', LIBXML_NOCDATA);
return $unifiedOrderrefundquery;
}
二、 微信沙箱申请退款接口请求地址
https://api.mch.weixin.qq.com/sandboxnew/pay/refund
这个接口跟微信支付中,
退款申请的实际地址差别很大,
并不是实际地址中添加/sandboxnew/
一定要注意,
实际请求地址
https://api.mch.weixin.qq.com/secapi/pay/refund
三、 微信申请退款接口请求参数
微信退款时,
请求的具体参数,
参考微信官方的这个开发文档
https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=9_4
1004测试用例中,
要求使用内部订单号out_trade_no查询,
也就是商户订单号,
你自己生成的订单号。
四、 微信沙箱中申请退款返回的数据
如果请求正确,
微信沙盒会返回类似下面的数据
<xml>
<openid><![CDATA[wxYYYYYYYYYYYY]]></openid>
<trade_type><![CDATA[MICROPAY]]></trade_type>
<cash_fee_type><![CDATA[CNY]]></cash_fee_type>
<refund_id><![CDATA[1234567892018020721584571768]]></refund_id>
<cash_refund_fee><![CDATA[501]]></cash_refund_fee>
<nonce_str><![CDATA[oq3136w3327rq8gg2q3bx1j4lhb5rj35]]></nonce_str>
<return_code><![CDATA[SUCCESS]]></return_code>
<refund_fee_type><![CDATA[CNY]]></refund_fee_type>
<mch_id><![CDATA[1333333333]]></mch_id>
<coupon_refund_fee><![CDATA[1]]></coupon_refund_fee>
<settlement_total_fee><![CDATA[501]]></settlement_total_fee>
<coupon_refund_fee_0><![CDATA[1]]></coupon_refund_fee_0>
<sign><![CDATA[C5D2D3976787D46897C32FA81AA691B4]]></sign>
<cash_fee><![CDATA[501]]></cash_fee>
<refund_fee><![CDATA[502]]></refund_fee>
<coupon_refund_id_0><![CDATA[12345]]></coupon_refund_id_0>
<coupon_refund_count><![CDATA[1]]></coupon_refund_count>
<coupon_type_0><![CDATA[NO_CASH]]></coupon_type_0>
<err_msg><![CDATA[SUCCESS]]></err_msg>
<cash_refund_fee_type><![CDATA[CNY]]></cash_refund_fee_type>
<return_msg><![CDATA[OK]]></return_msg>
<fee_type><![CDATA[CNY]]></fee_type>
<bank_type><![CDATA[CMC]]></bank_type>
<device_info><![CDATA[sandbox]]></device_info>
<out_trade_no><![CDATA[201802072140441086990058]]></out_trade_no>
<settlement_refund_fee><![CDATA[501]]></settlement_refund_fee>
<transaction_id><![CDATA[12345678920180207215845717680516]]></transaction_id>
<total_fee><![CDATA[502]]></total_fee>
<appid><![CDATA[wxXXXXXXXXXXXX]]></appid>
<out_refund_no><![CDATA[refound2018020721584515889]]></out_refund_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<err_code><![CDATA[SUCCESS]]></err_code>
</xml>