1. 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;
      }
      /**
       * 签名?#29992;?
       * @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相关内容?#34892;?#36259;的读者可查看本站专题:《PHP微信开发技巧汇总》、《php curl用法总结》、《PHP网络编程技巧总结》、《php字符串(string)用法总结》、《PHP中json格式数据操作技巧汇总》及《PHP针对XML文件操作技巧总结

    希望本文所述?#28304;?#23478;PHP程序设计?#20852;?#24110;助。

    相关文章

    • Mac OS下配置PHP+MySql环境

      Mac OS下配置PHP+MySql环境

      本文详细介绍了在mac OS系统下安装配置PHP+MySql环境的详细步鄹,十分的全面,这里推荐给有相同需求的小伙伴们。
      2015-02-02
    • php连接odbc数据源并保存与查询数据的方法

      php连接odbc数据源并保存与查询数据的方法

      这篇文章主要介绍了php连接odbc数据源并保存与查询数据的方法,涉及odbc数据源的操作技巧,非常具有实用价值,需要的朋友可以参考下
      2014-12-12
    • mayfish 数据入库验证代码

      mayfish 数据入库验证代码

      mayfish 可以灵活的自定义将要执行写入的数据内容的校验规则,以减少开发人员手动对每一个字段的数据进行校验的麻烦。
      2010-04-04
    • php自定义扩展名获取函数示例

      php自定义扩展名获取函数示例

      这篇文章主要介绍了php自定义扩展名获取函数,结合实例形式分析了php针对文件扩展名的截取操作实现技巧,需要的朋友可以参考下
      2016-12-12
    • PHP用SAX解析XML的实现代码与问题分析

      PHP用SAX解析XML的实现代码与问题分析

      近日在做一个解析XML的小程序,因为服务器是PHP4的,XML解析函数只能用SAX方式的xml_parser来解析了。
      2011-08-08
    • PHP中数组转换为SimpleXML教程

      PHP中数组转换为SimpleXML教程

      在本篇文章?#24418;?#20204;给大家总结了一篇关于PHP中数组转换为SimpleXML教程内容,有需要的朋友们跟着学习参考下。
      2019-01-01
    • PHP实现合并两个?#34892;?#25968;组的方法分析

      PHP实现合并两个?#34892;?#25968;组的方法分析

      这篇文章主要介绍了PHP实现合并两个?#34892;?#25968;组的方法,结合实例形式分析了php针对数组的合并、遍历、排序、去重等常见操作技巧,需要的朋友可以参考下
      2017-12-12
    • php 特殊字符处理函数

      php 特殊字符处理函数

      php防sql的注入.一般用到htmlspecialchars(),addslashes()等.不过还是对?#34892;?#29305;殊字符不起作用.
      2008-09-09
    • PHP如何根据文件头检测文件类型实例代码

      PHP如何根据文件头检测文件类型实例代码

      这篇文章主要给大家介绍了关于PHP如何根据文件头检测文件类型的相关资?#24076;?#25991;中通过示例代码介绍的非常详细,?#28304;?#23478;学习或者使用php具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
      2018-10-10
    • php函数之子字符串替换&#65279; str_replace

      php函数之子字符串替换&#65279; str_replace

      php函数str_replace: 返回一个字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果。
      2011-03-03

    最新评论

    山东群英会开奖查询
      1. 3d太湖钓叟字谜 体坛基本七星彩走势图 全无错三半单双中特 皇帝网六合图库大全 吉林十一选五快速开奖现场 江苏快3杀号技巧 上海时时彩玩法 炸金花三张牌免费版下载 生生不息com一尾中特 任选9场奖金统计 3d过滤缩水工具大全 奇人透码论坛www3831 双色球号码300期遗传走势图 国际象棋入门 贵州十一选五秘密