Heim  >  Artikel  >  Backend-Entwicklung  >  PHP implementiert den Beispielcode für den WeChat-Rückerstattungsantragsprozess

PHP implementiert den Beispielcode für den WeChat-Rückerstattungsantragsprozess

jacklove
jackloveOriginal
2018-05-22 15:04:331837Durchsuche

Vorläufige Vorbereitung:

Natürlich ist die WeChat-Zahlung abgewickelt, wie kann ich sonst eine Rückerstattung erhalten? Dieses Mal werde ich die offizielle Demo verwenden. Natürlich gibt es im Internet möglicherweise viele Meister, die die Demo selbst neu geschrieben und gekapselt haben, was möglicherweise einfacher zu verwenden und einfacher ist, aber ich empfehle die Verwendung aus folgenden Gründen dennoch nicht:

( 1) Es ist möglicherweise nicht voll funktionsfähig, möglicherweise implementiert es nur die WeChat-Zahlung, aber es gibt auch Geschäftsfunktionen wie die Beantragung von Rückerstattungen, die Abfrage von Rückerstattungen, Bestellanfragen, die Stornierung von Bestellungen usw., die Sie möglicherweise später benötigen Bequemlichkeit des Master-SDK, Sie werden verwirrt sein, wenn es neue Geschäftsanforderungen gibt.

(2) Sicherheitsaspekte: Wenn es um Zahlung und Geld geht, muss es sehr sicher sein. Obwohl ich mich auch über das offizielle SDK beschwere, wird es zumindest noch einmal neu geschrieben. Obwohl vorerst keine Probleme festgestellt wurden, wird es schlecht sein, wenn es Lücken gibt.

Dieser Artikel wird immer noch mithilfe der Methode „refund()“ implementiert, die in WxPay.Api.php, der wichtigsten Klassendatei im offiziellen SDK, bereitgestellt wird. Diese Methode befindet sich im 141. Kapitel von WxPay.Api.php Datei. OK, der Code lautet wie folgt:

* Um eine Rückerstattung zu beantragen, geben Sie mindestens eine out_trade_no und eine Transaction_ID in WxPayRefund ein und

* out_refund_no、total_fee、refund_fee、op_user_id为必填参数 
* appid、mchid、spbill_create_ip、nonce_str不需要填入 
* @param WxPayRefund $inputObj 
* @param int $timeOut
* @throws WxPayException 
* @return 成功时返回,其他抛异常 
*/ 
public static function refund($inputObj, $timeOut = 6){ 
$url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
//检测必填参数 
if(!$inputObj->IsOut_trade_noSet() && !$inputObj->IsTransaction_idSet()) {
throw new WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!");
}else if(!$inputObj->IsOut_refund_noSet()){
throw new WxPayException("退款申请接口中,缺少必填参数out_refund_no!");
}else if(!$inputObj->IsTotal_feeSet()){ 
throw new WxPayException("退款申请接口中,缺少必填参数total_fee!");
}else if(!$inputObj->IsRefund_feeSet()){ 
throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!"); 
}else if(!$inputObj->IsOp_user_idSet()){ 
throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!"); 
} 
$inputObj->SetAppid(WxPayConfig::APPID);//公众账号ID 
$inputObj->SetMch_id(WxPayConfig::MCHID);//商户号
$inputObj->SetNonce_str(self::getNonceStr());//随机字符串 
$inputObj->SetSign();//签名 
$xml = $inputObj->ToXml();
$startTimeStamp = self::getMillisecond();//请求开始时间
$response = self::postXmlCurl($xml, $url, true, $timeOut); 
$result = WxPayResults::Init($response); 
self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间 
return $result;
}
官方的方法,写的很清楚需要哪些参数,还有一些必须参数SDK已经帮我们补齐了,我将这个方法重新封装一下,便于在项目中调用:
* 微信退款
* @param string $order_id 订单ID
* @return 成功时返回(array类型),其他抛异常
*/ 
function wxRefund($order_id){
//我的SDK放在项目根目录下的Api目录下
require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php"; 
//查询订单,根据订单里边的数据进行退款 
$order = M('order')->where(array('id'=>$order_id,'is_refund'=>2,'order_status'=>1))->find(); 
$merchid = WxPayConfig::MCHID;
if(!$order) return false; 
$input = new WxPayRefund();
$input->SetOut_trade_no($order['order_sn']); //自己的订单号 
$input->SetTransaction_id($order['transaction_id']); //微信官方生成的订单流水号,在支付成功中有返回 
$input->SetOut_refund_no(getrand_num(true)); //退款单号
$input->SetTotal_fee($order['total_price']); //订单标价金额,单位为分
$input->SetRefund_fee($order['total_price']); //退款总金额,订单总金额,单位为分,只能为整数
$input->SetOp_user_id($merchid);
$result = WxPayApi::refund($input); //退款操作 
// 这句file_put_contents是用来查看服务器返回的退款结果 测试完可以删除了
//file_put_contents(APP_ROOT.'/Api/wxpay/logs/log3.txt',arrayToXml($result),FILE_APPEND); 
return $result;
}
这里需要吐槽一下,竟然不说返回值的类型,在支付的时候返回的是XML数据,这里竟然返回的是数组,让我措手不及,哈哈不过还是返回数组比较好,可以直接判断处理。
方法调用就更加简单了: 
//微信退款 
$result = wxRefund($order_id); 
// 这句file_put_contents是用来查看服务器返回的退款结果 测试完可以删除了 
//file_put_contents(APP_ROOT.'/Api/wxpay/logs/log4.txt',arrayToXml($result),FILE_APPEND); 
if(($result['return_code']=='SUCCESS') && ($result['result_code']=='SUCCESS')){ 
//退款成功 
}else if(($result['return_code']=='FAIL') || ($result['result_code']=='FAIL')){ 
//退款失败 
//原因
$reason = (empty($result['err_code_des'])?$result['return_msg']:$result['err_code_des']); 
}else{ 
//失败 
}

Die Rückerstattung wird wie folgt erfolgreich zurückgegeben:

PHP implementiert den Beispielcode für den WeChat-Rückerstattungsantragsprozess

Persönlicher Test ist richtig: Dies wird durch die Integration des offiziellen SDK implementiert. Wenn Sie das SDK nicht verwenden, können Sie eine einfachere Methode verwenden, siehe: PHP zur Implementierung der WeChat-Zahlung (jsapi-Zahlung) und Rückerstattung (keine Integration des Zahlungs-SDK erforderlich)

PHP implementiert den Beispielcode für den WeChat-Rückerstattungsantragsprozess

In diesem Artikel werden die relevanten Kenntnisse zu WeChat-Rückerstattungen erläutert php Chinesische Website.

Verwandte Empfehlungen:

Was bedeuten %s und %d in PHP?

Denken Sie an die PHP5-Paging-Codemethode für mehrere Tabellen, um die Gesamtzahl zu erhalten

Funktionsanalyse gängiger PHP-Funktionen

Das obige ist der detaillierte Inhalt vonPHP implementiert den Beispielcode für den WeChat-Rückerstattungsantragsprozess. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn