评论

收藏

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

开发技术 开发技术 发布于:2021-08-21 13:30 | 阅读数:227 | 评论:0

本文实例讲述了PHP实现微信退款的方法。分享给大家供大家参考,具体如下:
$obj = new WXRefund('参数');
$obj->refundApi();
直接能用 公众号的参数 自己加上吧 只能帮你们到这了!
<?php
namespace Wechat;
/**
 * 微信退款
 * @author  zzy
 * @version   $V1.0.0$
 * @date  2018-11-9
 */
class WXRefund
{
  protected $SSLCERT_PATH ='';//证书
  protected $SSLKEY_PATH = '';//证书
  protected $opUserId = '';//商户号
  protected $key = '';//API密钥
  protected $appId = '';//appId
  function __construct($outTradeNo, $totalFee, $outRefundNo, $refundFee)
  {
  //初始化退款类需要的变量
  $this->totalFee = $totalFee;//订单金额
  $this->refundFee = $refundFee;//退款金额
  $this->outTradeNo = $outTradeNo;//订单号
  $this->outRefundNo = $outRefundNo;//退款订单
  }
  /**
   * 通过微信api进行退款流程 唯一对外接口
   * @return string
   */
  public function refundApi()
  {
  $parma = array(
    'appid' => $this->appId,
    'mch_id' => $this->opUserId,
    'nonce_str' => randoms(32),//这个是随机数 自己封装去吧。。。
    'out_refund_no' => $this->outRefundNo,
    'out_trade_no' => $this->outTradeNo,
    'total_fee' => intval($this->totalFee * 100),
    'refund_fee' => intval($this->refundFee * 100),
  );
  $parma['sign'] = $this->getSign($parma, $this->key);
  $xmldata = $this->arrayToXml($parma);
  $xmlresult = $this->postXmlSSLCurl($xmldata, 'https://api.mch.weixin.qq.com/secapi/pay/refund');
  $result = $this->arrayToXml($xmlresult);
  return $result;
  }
  /**
   * 数组转xml
   * @param $arr
   * @return string
   */
  protected function arrayToXml($arr)
  {
  $xml = "<xml>";
  foreach ($arr as $key => $val) {
    if (is_numeric($val)) {
    $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
    } else {
    $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
    }
  }
  $xml .= "</xml>";
  return $xml;
  }
  /**
   * 签名加密
   * @param $params
   * @param $key
   */
  protected function getSign($params, $key)
  {
  ksort($params, SORT_STRING);
  $unSignParaString = $this->formatQueryParaMap($params, false);
  return $signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
  }
  /**
   * 排序
   * @param $paraMap
   * @param bool $urlEncode
   * @return bool|string
   */
  protected function formatQueryParaMap($paraMap, $urlEncode = false)
  {
  $buff = "";
  ksort($paraMap);
  foreach ($paraMap as $k => $v) {
    if (null != $v && "null" != $v) {
    if ($urlEncode) {
      $v = urlencode($v);
    }
    $buff .= $k . "=" . $v . "&";
    }
  }
  $reqPar = '';
  if (strlen($buff) > 0) {
    $reqPar = substr($buff, 0, strlen($buff) - 1);
  }
  return $reqPar;
  }
  /**
   * 需要使用证书的请求
   * @param $xml
   * @param $url
   * @param int $second
   * @return bool|mixed
   */
  protected function postXmlSSLCurl($xml, $url, $second = 30)
  {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_TIMEOUT, $second);
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  curl_setopt($ch, CURLOPT_HEADER, FALSE);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
  curl_setopt($ch, CURLOPT_SSLCERT, $this->SSLCERT_PATH);
  curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
  curl_setopt($ch, CURLOPT_SSLKEY, $this->SSLKEY_PATH);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
  $data = curl_exec($ch);
  if ($data) {
    curl_close($ch);
    return $data;
  } else {
    $error = curl_errno($ch);
    echo "curl出错,错误码:$error" . "<br>";
    curl_close($ch);
    return false;
  }
  }
}
希望本文所述对大家PHP程序设计有所帮助。

关注下面的标签,发现更多相似文章