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+DBM的同学录程序(5)
Oct 09 PHP
怎样在php中使用PDF文档功能
Oct 09 PHP
Smarty安装配置方法
Apr 10 PHP
解决MySQL中文输出变成问号的问题
Jun 05 PHP
PHP运行环境配置与开发环境的配置(图文教程)
Jun 04 PHP
CI框架中cookie的操作方法分析
Dec 12 PHP
php中的动态调用实例分析
Jan 07 PHP
YII CLinkPager分页类扩展增加显示共多少页
Jan 29 PHP
基于PHP生成简单的验证码
Jun 01 PHP
thinkPHP自动验证机制详解
Dec 05 PHP
PHP实现浏览器格式化显示XML的方法示例
Jan 22 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 25 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修改NetBeans默认字体的大小
2013/07/02 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
WordPress中限制非管理员用户在文章后只能评论一次
2015/12/31 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
详解Laravel视图间共享数据与视图Composer
2016/08/04 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
js实现简单的秒表
2020/01/16 Javascript
python实现socket客户端和服务端简单示例
2014/02/24 Python
使用C++扩展Python的功能详解
2018/01/12 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
元旦晚会策划方案
2014/02/18 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
伊索寓言教学反思
2014/05/01 职场文书
工程部岗位职责范本
2015/04/11 职场文书
教你怎么用python selenium实现自动化测试
2021/05/27 Python