当前位置:首页 > PHP教程 > php应用 > 列表

PHP实现微信退款的方法示例

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-14 11:50:44 浏览: 评论:0 

这篇文章主要介绍了PHP实现微信退款的方法,结合实例形式分析了php微信退款功能操作类与相关使用技巧,需要的朋友可以参考下。

本文实例讲述了PHP实现微信退款的方法,分享给大家供大家参考,具体如下:

$obj = new WXRefund('参数');

$obj->refundApi();

直接能用 公众号的参数 自己加上吧 只能帮你们到这了!

  1. <?php 
  2. namespace Wechat; 
  3. /** 
  4.  * 微信退款 
  5.  * @author    zzy 
  6.  * @version   $V1.0.0$ 
  7.  * @date    2018-11-9 
  8.  */ 
  9. class WXRefund 
  10.   protected $SSLCERT_PATH ='';//证书 
  11.   protected $SSLKEY_PATH = '';//证书 
  12.   protected $opUserId = '';//商户号 
  13.   protected $key = '';//API密钥 
  14.   protected $appId = '';//appId 
  15.   function __construct($outTradeNo$totalFee$outRefundNo$refundFee
  16.   { 
  17.     //初始化退款类需要的变量 
  18.     $this->totalFee = $totalFee;//订单金额 
  19.     $this->refundFee = $refundFee;//退款金额 
  20.     $this->outTradeNo = $outTradeNo;//订单号 
  21.     $this->outRefundNo = $outRefundNo;//退款订单 
  22.   } 
  23.   /** 
  24.    * 通过微信api进行退款流程 唯一对外接口 
  25.    * @return string 
  26.    */ 
  27.   public function refundApi() 
  28.   { 
  29.     $parma = array
  30.       'appid' => $this->appId, 
  31.       'mch_id' => $this->opUserId, 
  32.       'nonce_str' => randoms(32),//这个是随机数 自己封装去吧。。。 
  33.       'out_refund_no' => $this->outRefundNo, 
  34.       'out_trade_no' => $this->outTradeNo, 
  35.       'total_fee' => intval($this->totalFee * 100), 
  36.       'refund_fee' => intval($this->refundFee * 100), 
  37.     ); 
  38.     $parma['sign'] = $this->getSign($parma$this->key); 
  39.     $xmldata = $this->arrayToXml($parma); 
  40.     $xmlresult = $this->postXmlSSLCurl($xmldata'https://api.mch.weixin.qq.com/secapi/pay/refund'); 
  41.     $result = $this->arrayToXml($xmlresult); 
  42.     return $result
  43.   } 
  44.   /** 
  45.    * 数组转xml 
  46.    * @param $arr 
  47.    * @return string 
  48.    */ 
  49.   protected function arrayToXml($arr
  50.   { 
  51.     $xml = "<xml>"
  52.     foreach ($arr as $key => $val) { 
  53.       if (is_numeric($val)) { 
  54.         $xml .= "<" . $key . ">" . $val . "</" . $key . ">"
  55.       } else { 
  56.         $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">"
  57.       } 
  58.     } 
  59.     $xml .= "</xml>"
  60.     return $xml
  61.   } 
  62.   /** 
  63.    * 签名加密 
  64.    * @param $params 
  65.    * @param $key 
  66.    */ 
  67.   protected function getSign($params$key
  68.   { 
  69.     ksort($params, SORT_STRING); 
  70.     $unSignParaString = $this->formatQueryParaMap($params, false); 
  71.     return $signStr = strtoupper(md5($unSignParaString . "&key=" . $key)); 
  72.   } 
  73.   /** 
  74.    * 排序 
  75.    * @param $paraMap 
  76.    * @param bool $urlEncode 
  77.    * @return bool|string 
  78.    */ 
  79.   protected function formatQueryParaMap($paraMap$urlEncode = false) 
  80.   { 
  81.     $buff = ""
  82.     ksort($paraMap); 
  83.     foreach ($paraMap as $k => $v) { 
  84.       if (null != $v && "null" != $v) { 
  85.         if ($urlEncode) { 
  86.           $v = urlencode($v); 
  87.         } 
  88.         $buff .= $k . "=" . $v . "&"
  89.       } 
  90.     } 
  91.     $reqPar = ''
  92.     if (strlen($buff) > 0) { 
  93.       $reqPar = substr($buff, 0, strlen($buff) - 1); 
  94.     } 
  95.     return $reqPar
  96.   } 
  97.   /** 
  98.    * 需要使用证书的请求 
  99.    * @param $xml 
  100.    * @param $url 
  101.    * @param int $second 
  102.    * @return bool|mixed 
  103.    */ 
  104.   protected function postXmlSSLCurl($xml$url$second = 30) 
  105.   { 
  106.     $ch = curl_init(); 
  107.     curl_setopt($ch, CURLOPT_TIMEOUT, $second); 
  108.     curl_setopt($ch, CURLOPT_URL, $url); 
  109.     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
  110.     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
  111.     curl_setopt($ch, CURLOPT_HEADER, FALSE); 
  112.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
  113.     curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM'); 
  114.     curl_setopt($ch, CURLOPT_SSLCERT, $this->SSLCERT_PATH); 
  115.     curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM'); 
  116.     curl_setopt($ch, CURLOPT_SSLKEY, $this->SSLKEY_PATH); 
  117.     curl_setopt($ch, CURLOPT_POST, true); 
  118.     curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); 
  119.     $data = curl_exec($ch); 
  120.     if ($data) { 
  121.       curl_close($ch); 
  122.       return $data
  123.     } else { 
  124.       $error = curl_errno($ch); 
  125.       echo "curl出错,错误码:$error" . "<br>"
  126.       curl_close($ch); 
  127.       return false; 
  128.     } 
  129.   } 
  130. }

Tags: PHP微信退款

分享到: