退款API的操作⽅法
⾸先我们需要申请到商户的key密钥这个是在
账号关联(AppID绑定)
应⽤场景
当交易发⽣之后⼀段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接⼝将⽀付款退还给买家,⽀付将在收到退款请求并且验证成功之后,按照退款规则将⽀付款按原路退到买家账号上。
注意:
1、交易时间超过⼀年的订单⽆法提交退款
2、⽀付退款⽀持单笔交易分多次退款,多次退款需要提交原⽀付订单的商户订单号和设置不同的退款单号。申请退款总⾦额不能超过订单⾦额。⼀笔退款失败后重新提交,请不要更换退款单号,请使⽤原商户退款单号
3、请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次
4、每个⽀付订单的部分退款次数不能超过50次
5、如果同⼀个⽤户有多笔退款,建议分不同批次进⾏退款,避免并发退款导致退款失败
6、申请退款接⼝的返回仅代表业务的受理情况,具体退款是否成功,需要通过退款查询接⼝获取结果。
7、⼀个⽉之前的订单申请退款频率限制为:5000/min
接⼝地址
我们退款的时候需要注意要准备证书使⽤,在⽀付的时候不是必要条件
需要证书
请求需要双向证书。
⼀、超级管理员扫码登录⽀付商户平台后,进⼊账户中⼼到API安全;
点击申请证书,跳出⽣成API证书界⾯。点击“允许访问”,同意⽹页访问剪切板;
三、下载证书⼯具,在证书⼯具中点击“申请证书”按钮;
四、按照要求填写商户信息,点击下⼀步;
五、复制请求串到剪切板,在之前的⽣成API证书界⾯粘贴,输⼊“短信验证码”和“登录密码”;点击下⼀步,进⼊复制证书串界⾯。
六、复制证书串到剪切板,在证书⼯具的粘贴证书串界⾯,点击粘贴按钮。然后进⼊下⼀步,⽣成证书。
七、⽣成证书之后,到下载到电脑的证书⽂件,改个好认的名字发给技术⼈员,记得保留⼀个备份。
技术⼈员获得证书之后将证书部署到服务器上。也就完成了⽀付与等平台的对接了。
下⾯是请求时需要的参
字段名变量名必填类型⽰例值描述
公众账号ID appid是String(32)wx8888888888888888分配的公众账号ID(企业号corpid即为此appid)
商户号mch_id是String(32)1900000109⽀付分配的商户号
随机字符串nonce_str是String(32)5K8264ILTKCH16CQ2502SI8ZNMTM67VS随机字符串,不长于32位。
签名sign是String(32)C380BEC2BFD727A4B6845133519F3AD6签名,
签名类型sign_type否String(32)HMAC-SHA256签名类型,⽬前⽀持HMAC-SHA256和MD5,默认为MD5
⽀付订
单号
transaction_id
⼆选
⼀String(32)1217752501201407033233368018⽣成的订单号,在⽀付通知中有返回
商户订单号out_trade_no String(32)1217752501201407033233368018商户系统内部订单号,要求32个字符内(最少6个字符),只能是数字、⼤⼩写字母_-|*且在同⼀个商户号下唯⼀。
transaction_id、out_trade_no⼆选⼀,如果同时存在优先级:
transaction_id> out_trade_no
商户退款单号out_refund_no是String(64)1217752501201407033233368018商户系统内部的退款单号,商户系统内部唯⼀,只能是数字、⼤⼩写字母_-|*@ ,
同⼀退款单号多次请求只退⼀笔。
订单⾦额total_fee是int100订单总⾦额,单位为分,只能为整数
退款⾦额refund_fee 是int 100
退款总⾦额,订单总⾦额,单位为分,只能为整数,退款货币种类refund_fee_type 否String(8)CNY
退款货币类型,需与⽀付⼀致,或者不填。符合ISO 4217标准的三位字母代码,默认⼈民币:CNY ,
退款原因
refund_desc 否String(80)商品已售完
若商户传⼊,会在下发给⽤户的退款消息中体现退款原因
注意:若订单退款⾦额≤1元,且属于部分退款,则不会在退款消息中体现退款原因
退款资⾦来源
refund_account 否String(30)REFUND_SOURCE_RECHARGE_FUNDS
仅针对⽼资⾦流商户使⽤
REFUND_SOURCE_UNSETTLED_FUNDS---未结算资⾦退款(默认使⽤未结算资⾦退款)
REFUND_SOURCE_RECHARGE_FUNDS---可⽤余额退款
退款结果通知url
notify_url 否String(256)weixin.qq/notify/
异步接收⽀付退款结果通知的回调地址,通知URL 必须为外⽹可访问的url ,不允许带参数
公⽹域名必须为https ,如果是⾛专线接⼊,使⽤专线NAT IP 或者私有回调域名可使⽤http
如果参数中传了notify_url ,则商户平台上配置的回调地址将不会⽣效。
字段名变量名必填类型⽰例值
描述
由于跟⽀付的时候调⽤的⼀样 我们这⾥只写核⼼的转换代码 详情请看博客的⽀付流程需要的是xml 格式的数据所以我们必须转换为对应的格式
            $post_data = "<xml>                      <appid>".$appid."</appid>                      <body>".$body."</body>
<mch_id>".$mch_id."</mch_id>
<nonce_str>".$nonce_str."</nonce_str>                      <notify_url>".$notify_url."</notify_url>
<out_trade_no>".$out_trade_no."</out_trade_no>
<spbill_create_ip>".$spbill_create_ip."</spbill_create_ip>                      <total_fee>".$total_fee."</total_fee>
<trade_type>".$trade_type."</trade_type>                      <sign>".$sign."</sign>                      </xml>";//拼接成XML 格式
// <scene_info>$scene_info</scene_info>                // 地址
$url = 'h.weixin.qq/pay/unifiedorder';                $dataxml=$this ->posturl($url,$post_data);
$reruxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA);           //请求接收回来的数据转换为数组的格式
XML 转数组
//回调信息
public  function wxhd(){
//允许从外部加载XML 实体(防⽌XML 注⼊攻击)        libxml_disable_entity_loader(true );          // ⽤于接收所有的数据
$data=file_get_contents("php://input");
$postObj = (array)simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);          //此处 ⽤于变更订单的⽀付状态 或者其他操作
// 下⾯更新成功的变量(更新数据表) 最后⼀个 更新字段后        //此处⽤于返回给⽀付通知,我们也做出相应的修改        if (){
echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';        }                }
function posturl($data, $url){            $ch = curl_init();            //指定URL
curl_setopt($ch, CURLOPT_URL, $url);            //设定请求后返回结果
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);            //声明使⽤POST ⽅式来进⾏发送
curl_setopt($ch, CURLOPT_POST, 1);            //发送什么数据呢
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);            //忽略证书
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false );            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false );            //if ($is_pem == 1){
支持数字人民币支付curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); //sslCertType
curl_setopt($ch,CURLOPT_SSLCERT,'../key/wxpay/apiclient_cert.pem');//证书路径                curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');  //sslKeyType
curl_setopt($ch,CURLOPT_SSLKEY,'../key/wxpay/apiclient_key.pem');//证书路径          // }
//忽略header 头信息
curl_setopt($ch, CURLOPT_HEADER, 0);            //设置超时时间
curl_setopt($ch, CURLOPT_TIMEOUT, 10);            //发送请求
$output = curl_exec($ch);            //关闭curl
curl_close($ch);
//返回数据
return $output;
}
上⾯If⾥⾯可以填写证书路径地址附带的⽂件可以以不⽤IF 直接