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


Posted in PHP onMarch 26, 2019

本文实例讲述了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开发模式(简写版)
Mar 15 PHP
解析CI即CodeIgniter框架在Nginx下的重写规则
Jun 03 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
Jun 24 PHP
解析PHP正则提取或替换img标记属性
Jun 26 PHP
php foreach循环中使用引用的问题
Nov 06 PHP
PHP获取一个字符串中间一部分字符的方法
Aug 19 PHP
php中get_cfg_var()和ini_get()的用法及区别
Mar 04 PHP
php中实现用数组妩媚地生成要执行的sql语句
Jul 10 PHP
php给图片添加文字水印方法汇总
Aug 27 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
Aug 21 PHP
浅谈php调用python文件
Mar 29 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 PHP
PHP设计模式之单例模式定义与用法分析
Mar 26 #PHP
php+mysql开发中的经验与常识小结
Mar 25 #PHP
PHP设计模式之抽象工厂模式实例分析
Mar 25 #PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 25 #PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
Mar 25 #PHP
详解PHP神奇又有用的Trait
Mar 25 #PHP
PHP自动载入类文件函数__autoload的使用方法
Mar 25 #PHP
You might like
提升PHP速度全攻略
2006/10/09 PHP
PHP实现无限极分类图文教程
2014/11/25 PHP
php简单中奖算法(实例)
2017/08/15 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
JS执行删除前的判断代码
2014/02/18 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
关于Javascript中document.cookie的使用
2017/03/08 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
[42:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS OpTic
2018/03/31 DOTA
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
Python深入学习之对象的属性
2014/08/31 Python
Python中的类与对象之描述符详解
2015/03/27 Python
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
python中异常捕获方法详解
2017/03/03 Python
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
itchat接口使用示例
2017/10/23 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
Python列表对象实现原理详解
2019/07/01 Python
2014社区三八妇女节活动方案
2014/03/30 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
仓管员岗位职责
2015/02/03 职场文书
综合素质自我评价评语
2015/03/06 职场文书
教师读书笔记
2015/06/29 职场文书
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server