php教程

超轻量级php框架startmvc

PHP实现微信退款的方法示例

更新时间:2020-04-03 23:08:58 作者:startmvc
本文实例讲述了PHP实现微信退款的方法。分享给大家供大家参考,具体如下:$obj=newWXRefund('

本文实例讲述了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;
 }
 }
}

PHP 微信 退款