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 相关文章推荐
cache_lite试用
Feb 14 PHP
ZF等常用php框架中存在的问题
Jan 10 PHP
PHP实现Socket服务器的代码
Apr 03 PHP
php 搜索框提示(自动完成)实例代码
Feb 05 PHP
完美解决PHP中的Cannot modify header information 问题
Aug 12 PHP
php获取qq用户昵称和在线状态(实例分析)
Oct 27 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
Oct 31 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
Jan 04 PHP
php检测apache mod_rewrite模块是否安装的方法
Mar 14 PHP
PHP简单实现DES加密解密的方法
Jul 12 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
php中get_object_vars()在数组的实例用法
Feb 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
PHP中路径问题的解决方案
2006/10/09 PHP
基于mysql的论坛(1)
2006/10/09 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
php将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
javascript 数组排序函数
2009/08/20 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
全面解析Vue中的$nextTick
2020/12/24 Vue.js
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
基于python实现百度翻译功能
2019/05/09 Python
django使用graphql的实例
2020/09/02 Python
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
什么是网络协议
2016/04/07 面试题
道路交通安全实施方案
2014/03/12 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
干部培训简讯
2015/07/20 职场文书
交通事故协议书范本
2016/03/19 职场文书
交通安全宣传标语(100条)
2019/08/22 职场文书
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang