PHP实现微信退款功能


Posted in PHP onOctober 02, 2018

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

① 要是在测试的时候,网页提示 curl 58 说明 证书的路径出现问题(这里要填物理路径,也就是绝对路径)

②网页提示curl 52 说明你的证书引入少了,在官方的demo上只有两个证书 apiclient_cert.pem和 apiclient_key.pem  你还需要引入一个证书 rootca.pem,这个证书需要你登录到

你的商户平台上下载

3.要是网页提示  "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 相关文章推荐
杏林同学录(六)
Oct 09 PHP
php面向对象 字段的声明与使用
Jun 14 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
Jun 25 PHP
php实现文件下载实例分享
Jun 02 PHP
PHP计算百度地图两个GPS坐标之间距离的方法
Jan 09 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
php实现学生管理系统
Mar 21 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
Nov 22 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
PHP PDOStatement::nextRowset讲解
Feb 01 PHP
使用composer 安装 laravel框架的方法图文详解
Aug 02 PHP
PHP的new static和new self的区别与使用
Nov 27 PHP
PHP实现微信申请退款功能
Oct 01 #PHP
微信企业转账之入口类分装php代码
Oct 01 #PHP
PHP实现微信对账单处理
Oct 01 #PHP
php提取微信账单的有效信息
Oct 01 #PHP
YII分模块加载路由的实现方法
Oct 01 #PHP
php实现微信公众号企业转账功能
Oct 01 #PHP
详解json在php中的应用
Sep 30 #PHP
You might like
PHP 转义使用详解
2013/07/15 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
jQuery textarea的长度进行验证
2009/05/06 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
js 使FORM表单的所有元素不可编辑的示例代码
2013/10/17 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
详解JavaScript函数callee、call、apply的区别
2019/03/08 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
python实现简单的socket server实例
2015/04/29 Python
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
Python 列表去重去除空字符的例子
2019/07/20 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
介绍一下木马病毒的种类
2015/07/26 面试题
升国旗演讲稿
2014/09/05 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
考勤制度通知
2015/04/25 职场文书
学习经验交流会策划书
2015/11/02 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python