这篇文章主要为大家详细介绍了php实现微信支付之退款功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

网上的很多PHP微信支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入微信支付的带来些许帮助和借鉴意义。

直接运行该文件即可给指定的微信用户退款。

需要注意的事项:

1.微信退款到零钱要求必传证书,需要到这里账户中心->账户设置->API安全->下载证书,然后修改代码中的证书路径

2.该文件需放到支付授权目录下,可以在微信支付商户平台->产品中心->开发配置中设置。

3.如提示签名错误可以通过微信支付签名验证工具进行验证:微信公众平台支付接口调试工具

4.错误码参照:参照地址

代码如下:

/**

* 关于微信退款的说明

* 1.微信退款要求必传证书,需要到https://pay.weixin.qq.com 账户中心->账户设置->API安全->下载证书,证书路径在第119行和122行修改

* 2.错误码参照 :https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4

*/

header('Content-type:text/html; Charset=utf-8');

$mchid = 'xxxxx'; //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送

$appid = 'xxxxx'; //微信支付申请对应的公众号的APPID

$apiKey = 'xxxxx'; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥

$orderNo = ''; //商户订单号(商户订单号与微信订单号二选一,至少填一个)

$wxOrderNo = ''; //微信订单号(商户订单号与微信订单号二选一,至少填一个)

$totalFee = 0.01; //订单金额,单位:元

$refundFee = 0.01; //退款金额,单位:元

$refundNo = 'refund_'.uniqid(); //退款订单号(可随机生成)

$wxPay = new WxpayService($mchid,$appid,$apiKey);

$result = $wxPay->doRefund($totalFee, $refundFee, $refundNo, $wxOrderNo,$orderNo);

if($result===true){

echo 'refund success';exit();

}

echo 'refund fail';

class WxpayService

{

protected $mchid;

protected $appid;

protected $apiKey;

public $data = null;

public function __construct($mchid, $appid, $key)

{

$this->mchid = $mchid; //https://pay.weixin.qq.com 产品中心-开发配置-商户号

$this->appid = $appid; //微信支付申请对应的公众号的APPID

$this->apiKey = $key; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥

}

/**

* 退款

* @param float $totalFee 订单金额 单位元

* @param float $refundFee 退款金额 单位元

* @param string $refundNo 退款单号

* @param string $wxOrderNo 微信订单号

* @param string $orderNo 商户订单号

* @return string

*/

public function doRefund($totalFee, $refundFee, $refundNo, $wxOrderNo='',$orderNo='')

{

$config = array(

'mch_id' => $this->mchid,

'appid' => $this->appid,

'key' => $this->apiKey,

);

$unified = array(

'appid' => $config['appid'],

'mch_id' => $config['mch_id'],

'nonce_str' => self::createNonceStr(),

'total_fee' => intval($totalFee * 100), //订单金额 单位 转为分

'refund_fee' => intval($refundFee * 100), //退款金额 单位 转为分

'sign_type' => 'MD5', //签名类型 支持HMAC-SHA256和MD5,默认为MD5

'transaction_id'=>$wxOrderNo, //微信订单号

'out_trade_no'=>$orderNo, //商户订单号

'out_refund_no'=>$refundNo, //商户退款单号

'refund_desc'=>'商品已售完', //退款原因(选填)

);

$unified['sign'] = self::getSign($unified, $config['key']);

$responseXml = $this->curlPost('https://api.mch.weixin.qq.com/secapi/pay/refund', self::arrayToXml($unified));

$unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);

if ($unifiedOrder === false) {

die('parse xml error');

}

if ($unifiedOrder->return_code != 'SUCCESS') {

die($unifiedOrder->return_msg);

}

if ($unifiedOrder->result_code != 'SUCCESS') {

die($unifiedOrder->err_code);

}

return true;

}

public static function curlGet($url = '', $options = array())

{

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_TIMEOUT, 30);

if (!empty($options)) {

curl_setopt_array($ch, $options);

}

//https请求 不验证证书和host

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

$data = curl_exec($ch);

curl_close($ch);

return $data;

}

public function curlPost($url = '', $postData = '', $options = array())

{

if (is_array($postData)) {

$postData = http_build_query($postData);

}

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数

if (!empty($options)) {

curl_setopt_array($ch, $options);

}

//https请求 不验证证书和host

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

//第一种方法,cert 与 key 分别属于两个.pem文件

//默认格式为PEM,可以注释

curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');

curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/apiclient_cert.pem');

//默认格式为PEM,可以注释

curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');

curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/cert/apiclient_key.pem');

//第二种方式,两个文件合成一个.pem文件

// curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');

$data = curl_exec($ch);

curl_close($ch);

return $data;

}

public static function createNonceStr($length = 16)

{

$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

$str = '';

for ($i = 0; $i < $length; $i++) {

$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);

}

return $str;

}

public static function arrayToXml($arr)

{

$xml = "";

foreach ($arr as $key => $val) {

if (is_numeric($val)) {

$xml .= "" . $val . "" . $key . ">";

} else

$xml .= "" . $key . ">";

}

$xml .= "";

return $xml;

}

public static function getSign($params, $key)

{

ksort($params, SORT_STRING);

$unSignParaString = self::formatQueryParaMap($params, false);

$signStr = strtoupper(md5($unSignParaString . "&key=" . $key));

return $signStr;

}

protected static function formatQueryParaMap($paraMap, $urlEncode = false)

{

$buff = "";

ksort($paraMap);

foreach ($paraMap as $k => $v) {

if (null != $v && "null" != $v) {

if ($urlEncode) {

$v = urlencode($v);

}

$buff .= $k . "=" . $v . "&";

}

}

$reqPar = '';

if (strlen($buff) > 0) {

$reqPar = substr($buff, 0, strlen($buff) - 1);

}

return $reqPar;

}

}

?>

以上就是本篇文章的全部内容了,感谢大家阅读。更多请关注PHP中文网!

相关推荐:

php做一个微信退款,php实现微信支付之退款功能相关推荐

  1. 做一个关于我和她微信聊天记录的爱心词云图

    前言:    因为最近接触到了词云图,所以就想做一个关于和女朋友聊天的词云图,但是现在很少使用QQ了,所以就不得不使用微信导出聊天记录.于是我坐在电脑面前查阅资料查了一天,但是在走到快导出微信聊天记录 ...

  2. 做一个派发工单的微信小程序

    要制作一个派发工单的微信小程序,需要以下步骤: 了解微信小程序的开发环境和技术栈,比如微信小程序的前端语言.后端语言.数据存储方式等. 设计应用的功能需求,包括工单的创建.分配.执行和查询等. 根据功 ...

  3. 微信公众号授权,支付,退款总结

    经过两周的研究,终于又把微信支付也搞定了.作为一个技术人员就应该有总结思考的习惯.这里将自己做微信踩过的一些坑,以及自己的思考记录下来,希望能帮助各位和我一样做微信支付的小伙伴. 1.支付前准备 1. ...

  4. 利用反射做一个简易 Spring IOC 容器,模仿其装配功能

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/wenwenaier/article/ details/115549343 自己用代码模仿一个简易的SpringIOC容器,模仿 ...

  5. cocos creator做一个儿童数字答题的微信小游戏(1)

    接了个外包要做个数字答题的微信小游戏 给小学生玩的 准备大概15天完成吧,每天抽点一两个小时做一下 今天第一天先做主界面,先用cocos creator拼一个主界面出来 下面的每个按钮都是一个butt ...

  6. cocos creator做一个儿童数字答题的微信小游戏(2)

    今天写个设置scene出来

  7. python做一个考试系统_Python在线考试系统防作弊功能的思路和实现

    我自己用Python开发了一套教学管理软件,具有在线点名.提问.答疑.交作业.自测.在线考试.数据导入导出与汇总.Word试卷生成等多个功能,其中在线考试系统具有防作弊的功能,不少人觉得很神奇,其实思 ...

  8. 用Python做一个控制台程序实现图书管理器的简单功能,例如添加图书、查询库里的图书、删除图书、修改书籍信息、显示书籍信息,或者是借阅/归还...

    为了实现图书管理器的功能,需要考虑如下几点: 需要定义一个图书类,包含书名.作者.出版社.借阅状态.借阅人等属性,可以使用类的构造函数来初始化这些属性. 需要定义一个图书管理器类,包含一个用于存储图书 ...

  9. 微信支付 自动退款 php,银联在线、微信、支付宝自动退款接口文档总结和API地址...

    关于微信和支付宝自动退款接口的接入总结 一:支付宝的自动退款接口接入 支付宝官方api:https://doc.open.alipay.com/doc2/apiDetail.htm?spm=a219a ...

  10. 微信小程序打开微信公众号中的文章实战教程

    微信小程序获取微信公众号文章实战 情景 微信小程序中有一块功能是需要从关联的微信公众平台中获取最新的一篇文章进行展示,看了微信公众号的官方文档与微信小程序的文档,好像都没有找到类似的接口,所以想了一个 ...

最新文章

  1. 2022-2028年中国商业综合体行业市场前瞻与投资规划分析报告
  2. iOS网络编程-配置iCloud-图文解说
  3. Java程序员从笨鸟到菜鸟之(七十二)细谈Spring(四)利用注解实现spring基本配置详解
  4. android手机存储大小设置在哪里看,Android 最新获取手机内置存储大小,SD卡存储空间大小方法...
  5. SQL注入之union联合注入——sql-lab第一关(非常非常详细的过程)
  6. fota mcsync洛达检测_【科普篇】华强北洛达1536U芯片下的苹果Airpods,与正品差距还有多少...
  7. ubuntu12 04下django安装略谈
  8. stream去重_使用Java Stream API中DistinctBy删除重复数据
  9. Java并发编程中的join()与interrupt()函数
  10. U-boot在S3C2440上的移植详解(二)
  11. 数字图像处理-美图秀秀:大眼算法
  12. scrapy python中文手册_scrapy 官方文档读完总结
  13. rmats2sashimiplot:可视化rmats的可变剪切结果
  14. kali linux 入侵教程,kali linux 入侵wordpress! wpscan工具使用方法!
  15. 怎么在pdf上编辑文字内容
  16. OpenCV在图片上画线和矩形
  17. linux 未分配分区合并,这种情况如何扩展硬盘,合并硬盘分区,主分盘和未分配中间有个恢復分区,不能合并扩展硬盘!...
  18. 使用Anaconda写Python程序,强烈推荐Spyder
  19. Qt 的未来(2011年的文章)
  20. mysql3819错误,MySQL 8.0新特性 ― 检查性约束的使用简介

热门文章

  1. 关于智能制造的思考——以中航工业为例
  2. 【python|多进程】打印进度条
  3. ‘source‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  4. C++排序算法——归并排序
  5. 决策树系列(二)——剪枝
  6. 数值分析期末复习(解线性和非线性方程组)
  7. word字间距异常处理方式
  8. c语言发票的编码,关于增值税发票中商品税收分类编码对应的简称
  9. java爬取_java实现爬取知乎用户基本信息
  10. Volley源码解析(一)