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 相关文章推荐
第九节--绑定
Nov 16 PHP
php网页后退不再出现过期
Mar 08 PHP
PHP句法规则详解 入门学习
Nov 09 PHP
PHP输出数组中重名的元素的几种处理方法
Sep 05 PHP
php页面缓存ob系列函数介绍
Oct 18 PHP
基于PHP实现数据分页显示功能
May 26 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
Apr 04 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
Feb 15 PHP
PHP+Apache实现二级域名之间共享cookie的方法
Jul 24 PHP
详解Laravel服务容器的绑定与解析
Nov 05 PHP
PHP数组实际占用内存大小原理解析
Dec 11 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
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
JavaScript初学者应注意的七个细节详细介绍
2012/12/27 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
2013/06/13 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
javascript实现右下角广告框效果
2017/02/01 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
js Dom实现换肤效果
2017/10/21 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
vue实现图片上传预览功能
2019/12/23 Javascript
vue点击按钮实现简单页面的切换
2020/09/08 Javascript
js实现手表表盘时钟与圆周运动
2020/09/18 Javascript
vue element-ui中table合计指定列求和实例
2020/11/02 Javascript
[48:27]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
python中enumerate的用法实例解析
2014/08/18 Python
python使用生成器实现可迭代对象
2018/03/20 Python
python写入已存在的excel数据实例
2018/05/03 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
Revolution Beauty美国官网:英国知名化妆品网站
2018/07/23 全球购物
专科文秘应届生求职信
2013/11/18 职场文书
应届生自荐信范文
2014/02/21 职场文书
爱心活动计划书
2014/04/26 职场文书
公司投资建议书
2014/05/16 职场文书
遗失证明范文
2015/06/19 职场文书
2015年国培研修感言
2015/08/01 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书