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 相关文章推荐
深入了解php4(2)--重访过去
Oct 09 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
Sep 11 PHP
PHP下对数组进行排序的函数
Aug 08 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 PHP
PHP生成不同颜色、不同大小的tag标签函数
Sep 23 PHP
php函数指定默认值方法的小例子
Dec 04 PHP
php中动态修改ini配置
Oct 14 PHP
php生成curl命令行的方法
Dec 14 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
Dec 21 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
Mar 18 PHP
php 数组处理函数extract详解及实例代码
Nov 23 PHP
浅谈php(codeigniter)安全性注意事项
Apr 06 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
PHP+ACCESS 文章管理程序代码
2010/06/21 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
php实现的双向队列类实例
2014/09/24 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
php创建session的方法实例详解
2015/01/27 PHP
php生成RSS订阅的方法
2015/02/13 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
javascript中的prototype属性实例分析说明
2010/08/09 Javascript
JS跨域总结
2012/08/30 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
python中self原理实例分析
2015/04/30 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
Flask中jinja2的继承实现方法及实例
2021/03/03 Python
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
30年同学聚会感言
2014/01/30 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
关于办理居住证的介绍信模板
2019/11/27 职场文书
Python实现单例模式的5种方法
2021/06/15 Python