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实现验证码功能
Oct 09 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
May 09 PHP
php URL验证正则表达式
Jul 19 PHP
为你总结一些php信息函数
Oct 21 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
Sep 22 PHP
PHP数据库处理封装类实例
Dec 24 PHP
php cookie用户登录的详解及实例代码
Jan 03 PHP
Yii2配置Nginx伪静态的方法
May 05 PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
Jan 15 PHP
php实现推荐功能的简单实例
Sep 29 PHP
PHP网站常见安全漏洞,及相应防范措施总结
Mar 01 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生成html分页列表的代码
2007/03/18 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
jQuery调用WebService的实现代码
2011/06/19 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
Vuejs第十篇之vuejs父子组件通信
2016/09/06 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
举例介绍Python中的25个隐藏特性
2015/03/30 Python
Python字符编码判断方法分析
2016/07/01 Python
利用python将json数据转换为csv格式的方法
2018/03/22 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
详解Python做一个名片管理系统
2019/03/14 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
WoolOvers爱尔兰:羊绒、羊毛和棉针织品
2017/01/04 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
前台文员的岗位职责
2013/11/14 职场文书
网页设计个人找工作求职信
2013/11/28 职场文书
2014年社区学雷锋活动总结
2014/03/09 职场文书
高三高考决心书
2014/03/11 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
运动会表扬稿
2015/01/16 职场文书
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
Java使用jmeter进行压力测试
2021/07/09 Java/Android
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android