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

 更新时间:2019年03月26日 09:52:36   作者:php_zzy  
这篇文章主要介绍了PHP实现微信退款的方法,结合实例形式分析了php微信退款功能操作类与相关使用技巧,需要的朋友可以参考下

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《PHP微信开发技巧汇总》、《php curl用法总结》、《PHP网络编程技巧总结》、《php字符串(string)用法总结》、《PHP中json格式数据操作技巧汇总》及《PHP针对XML文件操作技巧总结

希望本文所述对大家PHP程序设计有所帮助。

相关文章

  • php 文章调用类代码

    php 文章调用类代码

    自己写的MonolithCMS上面用到的文章类,可能不是很通用, 但是胜在我有全部的注释
    2011-08-08
  • php全角字符转换为半角函数

    php全角字符转换为半角函数

    这篇文章主要介绍了PHP全角半角转换函数,把目前能找到的所有全角都列出来了一个个替换吧,需要的朋友可以参考下
    2014-02-02
  • PHP编写登录验证码功能 附调用方法

    PHP编写登录验证码功能 附调用方法

    这篇文章主要介绍了PHP编写登录验证码功能,文末附调用方法,并包含随机字符函数,和GD库画图函数,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • PHP实现图的邻接矩阵表示及几种简单遍历算法分析

    PHP实现图的邻接矩阵表示及几种简单遍历算法分析

    这篇文章主要介绍了PHP实现图的邻接矩阵表示及几种简单遍历算法,结合实例形式分析了php基于邻接矩阵实现图的定义及相关遍历操作技巧,需要的朋友可以参考下
    2017-11-11
  • PHP编程获取各个时间段具体时间的方法

    PHP编程获取各个时间段具体时间的方法

    这篇文章主要介绍了PHP编程获取各个时间段具体时间的方法,结合实例形式分析了基于date与strtotime函数进行日期时间运算的相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • php通过数组实现多条件查询实现方法(字符串分割)

    php通过数组实现多条件查询实现方法(字符串分割)

    这篇文章主要介绍了php通过数组实现多条件查询实现方法(字符串分割),需要的朋友可以参考下
    2014-05-05
  • PHP生成可点击刷新的验证码简单示例

    PHP生成可点击刷新的验证码简单示例

    这篇文章主要介绍了PHP生成可点击刷新的验证码,结合简单实例形式分析了php验证码的实现与调用显示方法,涉及js动态调用验证码php文件的相关技巧,需要的朋友可以参考下
    2016-05-05
  • PHP使用imagick扩展实现合并图像的方法

    PHP使用imagick扩展实现合并图像的方法

    这篇文章主要介绍了PHP使用imagick扩展实现合并图像的方法,结合实例形式分析了php基于imagick扩展处理图片的具体步骤与相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • 利用PHP抓取百度阅读的方法示例

    利用PHP抓取百度阅读的方法示例

    最近在百度阅读上购买了一本《永恒的终结》电子书,但是坑爹的发现只能在线阅读或者在手机app上阅读,不能下载下来放到kindle里。于是就尝试一下看能不能把这个文章下载下来。有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • php5对象复制、clone、浅复制与深复制实例详解

    php5对象复制、clone、浅复制与深复制实例详解

    这篇文章主要介绍了php5对象复制、clone、浅复制与深复制,结合实例形式详细分析了php5对象复制、clone、浅复制与深复制相关概念、原理、使用技巧与操作注意事项,需要的朋友可以参考下
    2019-08-08

最新评论