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学习 函数 课件
Jun 15 PHP
PHP文件注释标记及规范小结
Apr 01 PHP
解析数组非数字键名引号的必要性
Aug 09 PHP
php文件服务实现虚拟挂载其他目录示例
Apr 17 PHP
PHP中的常见魔术方法功能作用及用法实例
Jul 01 PHP
Zend Framework实现将session存储在memcache中的方法
Mar 22 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 PHP
PHP随机数函数rand()与mt_rand()的讲解
Mar 25 PHP
Laravel基础-关于引入公共文件的两种方式
Oct 18 PHP
PHP 枚举类型的管理与设计知识点总结
Feb 13 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
Sep 25 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
香妃
2021/03/03 冲泡冲煮
将OICQ数据转成MYSQL数据
2006/10/09 PHP
php发送post请求的三种方法
2014/02/11 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
2017/04/07 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
Python将多个excel文件合并为一个文件
2018/01/03 Python
python二进制读写及特殊码同步实现详解
2019/10/11 Python
Python selenium的基本使用方法分析
2019/12/21 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
为什么相对PHP黑python的更少
2020/06/21 Python
matplotlib 画双轴子图无法显示x轴的解决方法
2020/07/27 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
Python实现石头剪刀布游戏
2021/01/20 Python
Python扫描端口的实现
2021/01/25 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
如何理解委托
2012/01/06 面试题
寄语学生的话
2014/04/10 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
五好家庭事迹材料
2014/12/20 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript
解决redis批量删除key值的问题
2022/03/23 Redis