php实现微信支付之退款功能

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

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

需要注意的事项:

1.微信退款到零钱要求必传证书,需要到这里账户中心->账户设置->API安全->下载证书,然后修改代码中的证书路径 2.该文件需放到支付授权目录下,可以在微信支付商户平台->产品中心->开发配置中设置。 3.如提示签名错误可以通过微信支付签名验证工具进行验证:微信公众平台支付接口调试工具 4.错误码参照:参照地址

代码如下:

rush:PHP;"> 账户设置->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,$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,$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_POST,CURLOPT_POSTFIELDS,$postData); curl_setopt($ch,30); //设置cURL允许执行的最长秒数 if (!empty($options)) { curl_setopt_array($ch,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,CURLOPT_SSLKEY,getcwd().'/cert/apiclient_key.pem'); //第二种方式,两个文件合成一个.pem文件 // curl_setopt($ch,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 .= "<" . $key . ">" . $val . ""; 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,strlen($buff) - 1); } return $reqPar; } } ?>

github下载地址

相关文章

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?
C++程序:将一个数组的所有元素复制到另一个数组中
Golang:构建智能系统的基石
为什么AI开发者应该关注Golang?
在C和C++中,逗号(comma)的用法是用来分隔表达式或语句
PHP8底层开发原理解析及新特性应用实例
利用PHP8底层开发原理解析新特性:如何构建出色的Web应用