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 相关文章推荐
Session的工作方式
Oct 09 PHP
mysql建立外键
Nov 25 PHP
php模板之Phpbean的目录结构
Jan 10 PHP
深入eAccelerator与memcached的区别详解
Jun 06 PHP
destoon之一键登录设置
Jun 21 PHP
php使用Cookie控制访问授权的方法
Jan 21 PHP
PHP中开启gzip压缩的2种方法
Jan 31 PHP
PHP数组操作类实例
Jul 11 PHP
PHP连接数据库实现注册页面的增删改查操作
Mar 27 PHP
Yii 2.0中场景的使用教程
Jun 02 PHP
yii2局部关闭(开启)csrf的验证的实例代码
Jul 10 PHP
PHP7修改的函数
Mar 09 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开发文件系统实例讲解
2006/10/09 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
2018/10/14 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
javascript 装载iframe子页面,自适应高度
2009/03/20 Javascript
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
Javascript 面向对象特性
2009/12/28 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
python ipset管理 增删白名单的方法
2019/01/14 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
美国牛仔品牌:True Religion
2018/11/16 全球购物
Linux文件系统类型
2012/09/16 面试题
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
机电专业个人求职信范文
2013/12/30 职场文书
保护环境建议书300字
2014/05/13 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
2016七夕情人节广告语
2016/01/28 职场文书
python如何在word中存储本地图片
2021/04/07 Python
django上传文件的三种方式
2021/04/29 Python
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS
python​格式化字符串
2022/04/20 Python