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 相关文章推荐
PHP数字格式化
Dec 06 PHP
实用函数9
Nov 08 PHP
PHP中文件上传的一个问题
Sep 04 PHP
php实现上传图片生成缩略图示例
Apr 13 PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 PHP
简单谈谈favicon
Jun 10 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
Dec 18 PHP
Yii2中cookie用法示例分析
Jul 18 PHP
PHP实现判断数组是一维、二维或几维的方法
Feb 06 PHP
实例分析PHP将字符串转换成数字的方法
Jan 27 PHP
PHP Trait功能与用法实例分析
Jun 03 PHP
KindEditor在php环境下上传图片功能集成的方法示例
Jul 20 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 COOKIE设置为浏览器进程
2009/06/21 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
分享PHP header函数使用教程
2013/09/05 PHP
php  单例模式详细介绍及实现源码
2016/11/05 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
vue实现打地鼠小游戏
2020/08/21 Javascript
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
Python urllib2运行过程原理解析
2020/06/04 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
Python获取指定网段正在使用的IP
2020/12/14 Python
九年级语文教学反思
2014/02/04 职场文书
销售主管岗位职责
2014/02/08 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
革命电影观后感
2015/06/18 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
nginx之queue的具体使用
2022/06/28 Servers
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers