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 mb_convert_encoding文字编码的转换函数介绍
Nov 10 PHP
php文件操作实例代码
May 10 PHP
php计算程序运行时间的简单例子分享
May 10 PHP
php中Socket创建与监听实现方法
Jan 05 PHP
PHP的cURL库简介及使用示例
Feb 06 PHP
PHP获取文件相对路径的方法
Feb 26 PHP
php导入模块文件分享
Mar 17 PHP
详解 PHP加密解密字符串函数附源码下载
Dec 18 PHP
php微信公众平台示例代码分析(二)
Dec 06 PHP
PHPMailer发送邮件
Dec 28 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
Oct 18 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 木马攻击防御技巧
2009/06/13 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
php在文件指定行中写入代码的方法
2012/05/23 PHP
ThinkPHP中redirect用法分析
2014/12/05 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
Javascript与vbscript数据共享
2007/01/09 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
2011/01/01 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
2014/10/16 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
Django小白教程之Django用户注册与登录
2016/04/22 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
Python变量类型知识点总结
2019/02/18 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
安装docker-compose的两种最简方法
2019/07/30 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
关于numpy中eye和identity的区别详解
2019/11/29 Python
Python unittest框架操作实例解析
2020/04/13 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
项目经理的岗位职责
2013/11/23 职场文书
保护环境建议书
2014/03/12 职场文书