微信支付文档中申请退款的详细介绍,建议大家先把文档看一遍,然后有什么不明白的再百度。这里记录的是我用php进行微信支付退款。
1. 下载商户证书
登录上商户平台,依次【账户中心】-->【账户设置】-->【API安全】-->【证书下载】,解压,把apiclient_cert.pem和apiclient_key.pem两个文件放到项目目录中,分别用常量SSLCERT_PATH
和SSLKEY_PATH
表示文件路径。
| define(SSLCERT_PATH, "apiclient_cert.pem的路径"); |
| define(SSLKEY_PATH, "apiclient_key.pem的路径"); |
2. 组装参数
| $params = array( |
| 'out_trade_no' => $out_trade_no, |
| 'total_fee' => $total_fee, |
| 'refund_fee' => $refund_fee, |
| 'out_refund_no' => $mch_id. date("YmdHis"), |
| 'op_user_id' => $mch_id, |
| 'appid' => $appId, |
| 'mch_id' => $mch_id, |
| 'nonce_str' => getNonceStr(), |
| ); |
| |
| $params['sign'] = makeSign($params, $key); |
| |
| $xml = toXml($params); |
| |
| |
| |
| |
| |
| function getNonceStr($length = 32){ |
| $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; |
| $str =""; |
| for ( $i = 0; $i < $length; $i++ ) { |
| $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1); |
| } |
| return $str; |
| } |
| |
| |
| |
| |
| |
| private function makeSign($values, $key) |
| { |
| |
| ksort($values); |
| $string = $this->toUrlParams($values); |
| |
| $string = $string . "&key=".$key; |
| |
| $string = md5($string); |
| |
| $result = strtoupper($string); |
| return $result; |
| } |
| |
| |
| |
| function toUrlParams($values){ |
| $buff = ""; |
| foreach ($values as $k => $v){ |
| if($k != "sign" && $v != "" && !is_array($v)){ |
| $buff .= $k . "=" . $v . "&"; |
| } |
| } |
| $buff = trim($buff, "&"); |
| return $buff; |
| } |
| |
| |
| |
| |
| function toXml($values){ |
| if(!is_array($values) || count($values) <= 0){ |
| throw new WxPayException("数组数据异常!"); |
| } |
| |
| $xml = "<xml>"; |
| foreach ($values as $key=>$val) { |
| if (is_numeric($val)){ |
| $xml.="<".$key.">".$val."</".$key.">"; |
| }else{ |
| $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; |
| } |
| } |
| $xml.="</xml>"; |
| return $xml; |
| } |
3. 发送HTTPS请求
| $url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; |
| $response = postXmlCurl($xml, $url, true, 6); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function postXmlCurl($xml, $url, $useCert = false, $second = 30) { |
| $ch = curl_init(); |
| |
| curl_setopt($ch, CURLOPT_TIMEOUT, $second); |
| |
| curl_setopt($ch,CURLOPT_URL, $url); |
| curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); |
| curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2); |
| |
| curl_setopt($ch, CURLOPT_HEADER, FALSE); |
| |
| curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); |
| |
| if($useCert == true){ |
| |
| |
| curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); |
| curl_setopt($ch,CURLOPT_SSLCERT, SSLCERT_PATH); |
| curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); |
| curl_setopt($ch,CURLOPT_SSLKEY, SSLKEY_PATH); |
| } |
| |
| curl_setopt($ch, CURLOPT_POST, TRUE); |
| curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); |
| |
| $data = curl_exec($ch); |
| |
| if($data){ |
| curl_close($ch); |
| return $data; |
| } else { |
| $error = curl_errno($ch); |
| curl_close($ch); |
| throw new Exception("curl出错,错误码:$error"); |
| } |
| } |
4. 接收HTTPS响应数据
| |
| $result = fromXml($response); |
| if($result['return_code'] == 'SUCCESS'){ |
| |
| checkSign($result, $Key); |
| } |
| |
| |
| |
| |
| function fromXml($xml){ |
| if(!$xml){ |
| throw new Exception("xml数据异常!"); |
| } |
| |
| |
| libxml_disable_entity_loader(true); |
| $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); |
| return $values; |
| } |
| |
| |
| |
| function checkSign($values, $key){ |
| |
| if(!array_key_exists('sign', $values)){ |
| throw new Exception("签名错误!"); |
| } |
| |
| $sign = makeSign($values, $key); |
| if($values['sign'] == $sign){ |
| return true; |
| } |
| throw new Exception("签名错误!"); |
| } |
总结
微信支付退款和其他普通的API请求一样,只不过是多了证书而已。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律