PHP实现微信退款的方法示例
发布:smiling 来源: PHP粉丝网 添加日期:2021-11-14 11:50:44 浏览: 评论:0
这篇文章主要介绍了PHP实现微信退款的方法,结合实例形式分析了php微信退款功能操作类与相关使用技巧,需要的朋友可以参考下。
本文实例讲述了PHP实现微信退款的方法,分享给大家供大家参考,具体如下:
$obj = new WXRefund('参数');
$obj->refundApi();
直接能用 公众号的参数 自己加上吧 只能帮你们到这了!
- <?php
- namespace Wechat;
- /**
- * 微信退款
- * @author zzy
- * @version $V1.0.0$
- * @date 2018-11-9
- */
- class WXRefund
- {
- protected $SSLCERT_PATH ='';//证书
- protected $SSLKEY_PATH = '';//证书
- protected $opUserId = '';//商户号
- protected $key = '';//API密钥
- protected $appId = '';//appId
- function __construct($outTradeNo, $totalFee, $outRefundNo, $refundFee)
- {
- //初始化退款类需要的变量
- $this->totalFee = $totalFee;//订单金额
- $this->refundFee = $refundFee;//退款金额
- $this->outTradeNo = $outTradeNo;//订单号
- $this->outRefundNo = $outRefundNo;//退款订单
- }
- /**
- * 通过微信api进行退款流程 唯一对外接口
- * @return string
- */
- public function refundApi()
- {
- $parma = array(
- 'appid' => $this->appId,
- 'mch_id' => $this->opUserId,
- 'nonce_str' => randoms(32),//这个是随机数 自己封装去吧。。。
- 'out_refund_no' => $this->outRefundNo,
- 'out_trade_no' => $this->outTradeNo,
- 'total_fee' => intval($this->totalFee * 100),
- 'refund_fee' => intval($this->refundFee * 100),
- );
- $parma['sign'] = $this->getSign($parma, $this->key);
- $xmldata = $this->arrayToXml($parma);
- $xmlresult = $this->postXmlSSLCurl($xmldata, 'https://api.mch.weixin.qq.com/secapi/pay/refund');
- $result = $this->arrayToXml($xmlresult);
- return $result;
- }
- /**
- * 数组转xml
- * @param $arr
- * @return string
- */
- protected function arrayToXml($arr)
- {
- $xml = "<xml>";
- foreach ($arr as $key => $val) {
- if (is_numeric($val)) {
- $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
- } else {
- $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
- }
- }
- $xml .= "</xml>";
- return $xml;
- }
- /**
- * 签名加密
- * @param $params
- * @param $key
- */
- protected function getSign($params, $key)
- {
- ksort($params, SORT_STRING);
- $unSignParaString = $this->formatQueryParaMap($params, false);
- return $signStr = strtoupper(md5($unSignParaString . "&key=" . $key));
- }
- /**
- * 排序
- * @param $paraMap
- * @param bool $urlEncode
- * @return bool|string
- */
- protected 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;
- }
- /**
- * 需要使用证书的请求
- * @param $xml
- * @param $url
- * @param int $second
- * @return bool|mixed
- */
- protected function postXmlSSLCurl($xml, $url, $second = 30)
- {
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_TIMEOUT, $second);
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
- curl_setopt($ch, CURLOPT_HEADER, FALSE);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
- curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
- curl_setopt($ch, CURLOPT_SSLCERT, $this->SSLCERT_PATH);
- curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
- curl_setopt($ch, CURLOPT_SSLKEY, $this->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);
- echo "curl出错,错误码:$error" . "<br>";
- curl_close($ch);
- return false;
- }
- }
- }
Tags: PHP微信退款
- 上一篇:PHP设计模式之单例模式定义与用法分析
- 下一篇:PHP微信支付功能示例
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)