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横向重复区域显示二法
Sep 25 PHP
PHPMyadmin 配置文件详解(配置)
Dec 03 PHP
PHP文章按日期(月日)SQL归档语句
Nov 29 PHP
zend Framework中的Layout(模块化得布局)详解
Jun 28 PHP
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
php隐藏IP地址后两位显示为星号的方法
Nov 21 PHP
php调整服务器时间的方法
Apr 03 PHP
浅谈PHP接收POST数据方式
Jun 05 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
Dec 29 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
Jan 19 PHP
ThinkPHP中图片按比例切割的代码实例
Mar 08 PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 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实现Ftp用户的在线管理的代码
2007/03/06 PHP
PHP6 mysql连接方式说明
2009/02/09 PHP
用php将任何格式视频转为flv的代码
2009/09/03 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
jquery.pager.js分页实现详解
2019/07/29 jQuery
JS Array.from()将伪数组转换成数组的方法示例
2020/03/23 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
TensorFlow 滑动平均的示例代码
2018/06/19 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
如何用python处理excel表格
2020/06/09 Python
浅析Python打包时包含静态文件处理方法
2021/01/15 Python
Raffaello Network西班牙:意大利拉斐尔时尚购物网
2019/03/12 全球购物
GWT都有什么特性
2016/12/02 面试题
大学生的网上创业计划书
2013/12/31 职场文书
小学五年级语文上册教学计划
2015/01/22 职场文书
银行优秀员工推荐信
2015/03/24 职场文书
解决redis批量删除key值的问题
2022/03/23 Redis
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript
python读取mat文件生成h5文件的实现
2022/07/15 Python