PHP开发实现微信退款功能示例


Posted in PHP onNovember 25, 2017

本文实例讲述了PHP开发实现微信退款功能。分享给大家供大家参考,具体如下:

最近在调微信退款接口,发现有许多坑,更大家分享一下

① 要是在测试的时候,网页提示 curl 58 说明 证书的路径出现问题(这里要填物理路径,也就是绝对路径)
② 网页提示curl 52 说明你的证书引入少了,在官方的demo上只有两个证书 apiclient_cert.pem和 apiclient_key.pem  你还需要引入一个证书 rootca.pem,这个证书需要你登录到
你的商户平台上下载
③ 要是网页提示  "HTTP/1.1 200 OK Server: nginx Date: Tue, 20 Jun 2017 08:08:01 GMT Content-Type: text/plain Content-Length: 852 Connection: keep-alive Keep-Alive: timeout=8
说明你的代码是没有问题的 ,应该是参数出错了 我之前错的地方是把 out_refund_no和 out_trade_no写的一样,微信官网上也是这样写的 ,但是就是出现问题,我把out_refund_no 修改了一下 发现可以了

注意:金额的单位是分

下面就是我写的接口

function Home_index() {
  date_default_timezone_set("Asia/Shanghai");
  $date = date("YmdHis");
  $appid = "";
  $mch_id = "";
  $out_trade_no = "14487658021497944120";
  $op_user_id = "";
  $out_refund_no = $date;
  $total_fee = "500";
  $refund_fee = "500";
//  $transaction_id = "4009542001201706206596667604";
  $key = "";
  $nonce_str = nonceStr();
  $ref = strtoupper(md5("appid=$appid&mch_id=$mch_id&nonce_str=$nonce_str&op_user_id=$op_user_id"
          . "&out_refund_no=$out_refund_no&out_trade_no=$out_trade_no&refund_fee=$refund_fee&total_fee=$total_fee"
          . "&key=$key")); //sign加密MD5
  $refund = array(
  'appid' =>$appid, //应用ID,固定
  'mch_id' => $mch_id, //商户号,固定
  'nonce_str' => $nonce_str, //随机字符串
  'op_user_id' => $op_user_id, //操作员
  'out_refund_no' => $out_refund_no, //商户内部唯一退款单号
  'out_trade_no' => $out_trade_no, //商户订单号,pay_sn码 1.1二选一,微信生成的订单号,在支付通知中有返回
  // 'transaction_id'=>'1',//微信订单号 1.2二选一,商户侧传给微信的订单号
  'refund_fee' => $refund_fee, //退款金额
  'total_fee' => $total_fee, //总金额
  'sign' => $ref//签名
  );
  $url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
  ; //微信退款地址,post请求
  $xml = arrayToXml($refund);
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HEADER, 1);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); //证书检查
  if ($useCert == true) {
    // 设置证书
    curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem');
    curl_setopt($ch, CURLOPT_SSLCERT, dirname(__FILE__) . '/WxPay/cert/apiclient_cert.pem');
    curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem');
    curl_setopt($ch, CURLOPT_SSLKEY, dirname(__FILE__) . '/WxPay/cert/apiclient_key.pem');
    curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem');
    curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/WxPay/cert/rootca.pem');
  }
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
  $xml = curl_exec($ch);
  // 返回结果0的时候能只能表明程序是正常返回不一定说明退款成功而已
  if ($xml) {
    curl_close($ch);
    // 把xml转化成数组
    libxml_disable_entity_loader(true);
    $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
//    var_dump($xmlstring);
    $result['errNum'] = 0;
    $result['info'] = object_to_array($xmlstring);
//    var_dump($result);
    return $result;
  } else {
    $error = curl_errno($ch);
    curl_close($ch);
    // 错误的时候返回错误码。
    $result['errNum'] = $error;
    return $result;
  }
}
function arrayToXml($arr) {
  $xml = "<root>";
  foreach ($arr as $key => $val) {
    if (is_array($val)) {
      $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
    } else {
      $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
    }
  }
  $xml .= "</root>";
  return $xml;
}
function object_to_array($obj) {
  $obj = (array) $obj;
  foreach ($obj as $k => $v) {
    if (gettype($v) == 'resource') {
      return;
    }
    if (gettype($v) == 'object' || gettype($v) == 'array') {
      $obj[$k] = (array) object_to_array($v);
    }
  }
  return $obj;
}
function nonceStr() {
  $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
  $str = "";
  $length = 32;
  for ($i = 0; $i < $length; $i++) {
    $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
  }
  // 随机字符串
  return $str;
}
Home_index();

赶快添加到你的项目中去吧

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
vBulletin HACK----关于排版的两个HACK
Oct 09 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
Jun 09 PHP
php中函数的形参与实参的问题说明
Sep 01 PHP
基于session_unset与session_destroy的区别详解
Jun 03 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
Jul 03 PHP
PHP+Mysql基于事务处理实现转账功能的方法
Jul 08 PHP
Yii2 RESTful中api的使用及开发实例详解
Jul 06 PHP
php封装的smartyBC类完整实例
Oct 19 PHP
thinkPHP中验证码的简单实现方法
Dec 05 PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
CI框架(CodeIgniter)操作redis的方法详解
Jan 25 PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 #PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 #PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 #PHP
php图片合成方法(多张图片合成一张)
Nov 25 #PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 #PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
Nov 24 #PHP
PHP+Apache环境中如何隐藏Apache版本
Nov 24 #PHP
You might like
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
PHP+MySQL删除操作实例
2015/01/21 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
2017/05/12 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
Javascript 实用小技巧
2010/04/07 Javascript
jquery下json数组的操作实现代码
2010/08/09 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
判断访客终端类型集锦
2015/06/05 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
浅谈JavaScript中的对象及Promise对象的实现
2015/11/15 Javascript
基于jQuery通过jQuery.form.js插件实现异步上传
2015/12/13 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
python脚本内运行linux命令的方法
2015/07/02 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
HTML5 拖放(Drag 和 Drop)详解与实例代码
2017/09/14 HTML / CSS
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
有影响力的品牌之家:Our Social Collective
2019/06/08 全球购物
介绍Ibatis的核心类
2013/11/18 面试题
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
外贸实习生自荐信范文
2013/11/24 职场文书
2015年酒店工作总结
2015/04/28 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL