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 使用MySQL管理Session的回调函数详解
Jun 21 PHP
浅谈php函数serialize()与unserialize()的使用方法
Aug 19 PHP
PHP中imagick函数的中文解释
Jan 21 PHP
Zend Framework教程之Application用法实例详解
Mar 14 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
php mysql like 实现多关键词搜索的方法
Oct 29 PHP
yii2局部关闭(开启)csrf的验证的实例代码
Jul 10 PHP
php获取微信基础接口凭证Access_token
Aug 23 PHP
PHP attributes()函数讲解
Feb 03 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
Mar 01 PHP
PHP代码覆盖率统计详解
Jul 22 PHP
PHP时间类完整代码实例
Feb 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
PHP4和PHP5共存于一系统
2006/11/17 PHP
ADODB的数据库封包程序库
2006/12/31 PHP
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
PHP函数引用返回的实例详解
2016/09/11 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
2016/07/25 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
python生成指定长度的随机数密码
2014/01/23 Python
Python Sleep休眠函数使用简单实例
2015/02/02 Python
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
无法使用pip命令安装python第三方库的原因及解决方法
2018/06/12 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
什么是Python中的匿名函数
2020/06/02 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
自立自强的名人事例
2014/02/10 职场文书
《会变的花树叶》教学反思
2014/02/10 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
python高温预警数据获取实例
2022/07/23 Python