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 curl模拟post提交数据示例
Dec 31 PHP
PHP实现克鲁斯卡尔算法实例解析
Aug 22 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
Aug 18 PHP
PHP实现HTML页面静态化的方法
Nov 04 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 PHP
Centos PHP 扩展Xchche的安装教程
Jul 09 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
Sep 21 PHP
php动态读取数据清除最右边距的方法
Apr 12 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
Jun 21 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
可兼容php5与php7的cURL文件上传功能实例分析
May 11 PHP
java解析json方法总结
May 16 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_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
PHP中实现Bloom Filter算法
2015/03/30 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
Yii 框架入口脚本示例分析
2020/05/19 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
定义select的边框颜色
2008/04/28 Javascript
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
javascript 面向对象编程 function也是类
2009/09/17 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
JS访问SWF的函数用法实例
2015/07/01 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
一篇文章,教你学会Vue CLI 插件开发
2019/04/17 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
玩转python爬虫之cookie使用方法
2016/02/17 Python
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
android面试问题与答案
2016/12/27 面试题
商务英语专业求职信范文
2014/01/28 职场文书
运动会邀请函范文
2014/01/31 职场文书
遗产继承公证书
2014/04/09 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书