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 相关文章推荐
下载文件的点击数回填
Oct 09 PHP
使用 php4 加速 web 传输
Oct 09 PHP
PHP中MVC模式的模板引擎开发经验分享
Mar 23 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 PHP
php实现的支持断点续传的文件下载类
Sep 23 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
YII2自动登录Cookie总是失效的解决方法
Jun 28 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 PHP
为你的 Laravel 验证器加上多验证场景的实现
Apr 07 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函数学习之PHP函数点评
2012/07/05 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
PHP7引入的&quot;??&quot;和&quot;?:&quot;的区别讲解
2019/04/08 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
2013/08/26 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
vue动态设置路由权限的主要思路
2021/01/13 Vue.js
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
python装饰器使用方法实例
2013/11/21 Python
详解python字节码
2018/02/07 Python
python随机取list中的元素方法
2018/04/08 Python
python标记语句块使用方法总结
2019/08/05 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
Python二元赋值实用技巧解析
2019/10/25 Python
python编写俄罗斯方块
2020/03/13 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
Bose加拿大官方网站:美国知名音响品牌
2019/03/21 全球购物
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
我的梦中国梦演讲稿
2014/04/23 职场文书
Python编程编写完善的命令行工具
2021/09/15 Python