- 微信退款需要配置的数据有:
- 公众号的 $appid
- 商户号 $mch_id
- 随机字符串 $nonce_str
- 商户订单号 $out_trade_no
- 商户退单号 $out_refund_no
- 退款总金额 $refund_fee
- 订单总金额 $total_fee
- 操作员帐号 $op_user_id
- 商户平台中对应的key值 $key
- ---------------------------------
- 注意事项:
- 1.订单总金额和退款总金额是 处理单位是分 而且只能是整数
- 2.操作员账号 可以 用商户号就可以
- 3.商户退单号:自己随机一个只要不重复就可以,为了方便只要放上订单号就行本身也是不重复的
- ----------------------------------
- 使用:
- 根据上面的信息进行签名生成:
- 1.生成一个随机字符串
- // 签名设置中随机字符串
- function nonceStr(){
- $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
- $str ="";
- $length = 32;
- for($i = 0; $i < $length; $i++){
- $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
- }
- // 随机字符串
- return $str;
- }
- 2.签名生成
- $arrayName = array('op_user_id'=>$op_user_id,'refund_fee'=>$refund_fee,
- 'total_fee'=>$total_fee,'appid'=>$appid,'mch_id'=>$mch_id,'out_trade_no'=>$out_trade_no,
- 'nonce_str'=>$nonce_str,'out_refund_no'=>$out_refund_no);
- ksort($arrayName);
- $sign = '';
- foreach ($arrayName as $key => $value) {
- $sign.='&'.$key.'='.$value;
- }
- // 进行拼凑
- // 去掉开头的&并且进行MD5加密处理
- $stringSignTemp = ltrim($sign,'&');
- $key = "商户号申请的时候你自己的输入的key值";
- $stringSignTemp = $stringSignTemp.'&key='.$key;
- $sign = md5($stringSignTemp);
- $sign = strtoupper($sign);// 最终获得签名的值
- 3.把上面的所有数据进行组成xml数据
- $xmldata = "<xml><appid>".$appid."</appid><mch_id>".$mch_id."</mch_id><nonce_str>"
- .$nonce_str."</nonce_str><op_user_id>".$op_user_id."</op_user_id><out_refund_no>".
- $out_refund_no."</out_refund_no><out_trade_no>". $out_trade_no."</out_trade_no><refund_fee>".
- $refund_fee ."</refund_fee><total_fee>". $total_fee."</total_fee><sign>".$sign."</sign></xml>";
- 4.微信退款接口准备:
- $url = 'https://api.mch.weixin.qq.com/secapi/pay/refund';// 退款微信接口准备
- 5.进行curl 有证书post数据
- function postXmlCurl($xmldata, $url, $useCert = false, $second = 6)
- {
- // 证书验证与否
- $ch = curl_init();
- // 设置超时
- curl_setopt($ch, CURLOPT_TIMEOUT, $second);
- curl_setopt($ch,CURLOPT_URL, $url);
- curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
- curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
- // 设置header
- curl_setopt($ch, CURLOPT_HEADER, FALSE);
- // 要求结果为字符串且输出到屏幕上
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
- // 退款严格使用证书,必须是公众号所对应的商户平台下的证书才可以,安全不的外泄
- if($useCert == true){
- // 设置证书
- // 使用证书:cert 与 key 分别属于两个.pem文件
- curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
- curl_setopt($ch,CURLOPT_SSLCERT,ROOT_PATH."wxpay/cert/apiclient_cert.pem");
- curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
- curl_setopt($ch,CURLOPT_SSLKEY,ROOT_PATH."wxpay/cert/apiclient_key.pem");
- }
- // post提交方式
- curl_setopt($ch, CURLOPT_POST, TRUE);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);
- // 运行curl
- $xml = curl_exec($ch);
- // 返回结果0的时候能只能表明程序是正常返回不一定说明退款成功而已
- if($xml){
- curl_close($ch);
- // 把xml转化成数组
- libxml_disable_entity_loader(true);
- $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
- $result['errNum'] = 0;
- $result['info'] = objectToArray($xmlstring);
- return $result;
- }else{
- $error = curl_errno($ch);
- curl_close($ch);
- // 错误的时候返回错误码。
- $result['errNum'] = $error;
- return $result;
- }
- }
- 注意:开发过程中,遇到的问题:证书:需要在上商户平台中获得然后根据自己的实际路径进行填写。
微信退款开发过程
最新推荐文章于 2024-03-07 14:27:59 发布