PHP开发实现微信退款功能示例


Posted in PHP onNovember 25, 2017

本文实例讲述了PHP开发实现微信退款功能。分享给大家供大家参考,具体如下:

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

① 要是在测试的时候,网页提示 curl 58 说明 证书的路径出现问题(这里要填物理路径,也就是绝对路径)
② 网页提示curl 52 说明你的证书引入少了,在官方的demo上只有两个证书 apiclient_cert.pem和 apiclient_key.pem  你还需要引入一个证书 rootca.pem,这个证书需要你登录到
你的商户平台上下载
③ 要是网页提示  "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 相关文章推荐
PHP学习笔记之三 数据库基本操作
Jan 17 PHP
使用array mutisort 实现按某字段对数据排序
Jun 18 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
Jun 20 PHP
PHP上传文件时文件过大$_FILES为空的解决方法
Nov 26 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
Aug 23 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
php基本函数汇总
Jul 09 PHP
php图像处理类实例
Jul 28 PHP
php给图片加文字水印
Jul 31 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
Mar 08 PHP
深入解析PHP的Yii框架中的event事件机制
Mar 17 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 #PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 #PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 #PHP
php图片合成方法(多张图片合成一张)
Nov 25 #PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 #PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
Nov 24 #PHP
PHP+Apache环境中如何隐藏Apache版本
Nov 24 #PHP
You might like
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
Javascript 解疑
2009/11/11 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
简介JavaScript中Math.cos()余弦方法的使用
2015/06/15 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
bootstrap table操作技巧分享
2017/02/15 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
vue 取出v-for循环中的index值实例
2019/11/09 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
python绘制条形图方法代码详解
2017/12/19 Python
pandas中去除指定字符的实例
2018/05/18 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
Ratchet 模态框的实现
2020/08/19 HTML / CSS
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
介绍一下SOA和SOA的基本特征
2016/02/24 面试题
房地产销售大学生自我评价分享
2013/11/11 职场文书
名人演讲稿范文
2013/12/28 职场文书
关于工资低的辞职信
2014/01/14 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
毕业大学生自荐信
2014/06/17 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers