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 相关文章推荐
php模拟socket一次连接,多次发送数据的实现代码
Jul 26 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
Jan 11 PHP
php上传文件常见问题总结
Feb 03 PHP
PHP实现抓取迅雷VIP账号的方法
Jul 30 PHP
php商品对比功能代码分享
Sep 24 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
PHP中overload与override的区别
Feb 13 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
Apr 20 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 PHP
用PHP的反射实现委托模式的讲解
Mar 22 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 PHP
php的instanceof和判断闭包Closure操作示例
Jan 26 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
PHP.MVC的模板标签系统(三)
2006/09/05 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
PHP积分兑换接口实例
2015/02/09 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
ES6 Symbol数据类型的应用实例分析
2019/06/26 Javascript
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
[01:04:32]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第二场 2月23日
2021/03/11 DOTA
python将ip地址转换成整数的方法
2015/03/17 Python
python中查看变量内存地址的方法
2015/05/05 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
一个基于flask的web应用诞生(1)
2017/04/11 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
Python格式化输出%s和%d
2018/05/07 Python
使用OpCode绕过Python沙箱的方法详解
2019/09/03 Python
python 实现二维列表转置
2019/12/02 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
python super函数使用方法详解
2020/02/14 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
清除canvas画布内容(点擦除+线擦除)
2020/08/12 HTML / CSS
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
2016年入党心得体会范文
2016/01/23 职场文书
创业计划书之干洗店
2019/09/10 职场文书
探究Mysql模糊查询是否区分大小写
2021/06/11 MySQL
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang