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 相关文章推荐
15种PHP Encoder的比较
Apr 17 PHP
PHP-MySQL教程归纳总结
Jun 07 PHP
PHP 第二节 数据类型之数组
Apr 28 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
PHP获取MAC地址的具体实例
Dec 13 PHP
PHP中array_map与array_column之间的关系分析
Aug 19 PHP
php获取客户端电脑屏幕参数的方法
Jan 09 PHP
php限制上传文件类型并保存上传文件的方法
Mar 13 PHP
thinkphp autoload 命名空间自定义 namespace
Jul 17 PHP
Java中final关键字详解
Aug 10 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
php实现word转html的方法
Jan 22 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
构建简单的Webmail系统
2006/10/09 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
2019/10/16 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
javascript 定义初始化数组函数
2009/09/07 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
js如何验证密码强度
2020/03/18 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
[01:07:53]RNG vs VG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
详解Django框架中用context来解析模板的方法
2015/07/20 Python
Python的组合模式与责任链模式编程示例
2016/02/02 Python
Python实现爬取需要登录的网站完整示例
2017/08/19 Python
python的exec、eval使用分析
2017/12/11 Python
单链表反转python实现代码示例
2018/02/08 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
基于python的BP神经网络及异或实现过程解析
2019/09/30 Python
python定时任务 sched模块用法实例
2019/11/04 Python
python实现简单的五子棋游戏
2020/09/01 Python
地理科学专业毕业生求职信
2013/10/15 职场文书
升职自荐书范文
2013/11/28 职场文书
信息系统专业个人求职信范文
2013/12/07 职场文书
高二化学教学反思
2014/01/30 职场文书
万年牢教学反思
2014/02/15 职场文书
yy婚礼主持词
2014/03/14 职场文书
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL
Pandas 数据编码的十种方法
2022/04/20 Python