Maison  >  Article  >  développement back-end  >  Méthode PHP pour mettre en œuvre le processus de demande de remboursement WeChat

Méthode PHP pour mettre en œuvre le processus de demande de remboursement WeChat

小云云
小云云original
2018-03-16 09:42:142356parcourir

Cet article vous présente principalement l'implémentation php du processus de demande de remboursement WeChat. Il est implémenté à l'aide de la méthode payment() fournie dans WxPay.Api.php, le fichier de classe le plus important du SDK officiel. pour référence complète. J’espère que cet article pourra vous aider tous.

Bien sûr, le paiement WeChat a été réglé, sinon comment puis-je obtenir un remboursement Cette fois, j'utiliserai la démo officielle ? Bien sûr, il peut y avoir de nombreux maîtres sur Internet qui ont eux-mêmes réécrit et encapsulé la démo, ce qui est peut-être plus facile à utiliser et plus simple, mais je ne recommande toujours pas de l'utiliser pour les raisons suivantes :

( 1) Il n'est peut-être pas entièrement fonctionnel, peut-être qu'il implémente simplement le paiement WeChat, mais il existe également des fonctions commerciales telles que la demande de remboursement, la demande de remboursement, les demandes de commande, l'annulation de commandes, etc. dont vous pourriez avoir besoin plus tard. commodité du SDK du maître, vous serez confus s'il y a de nouveaux besoins commerciaux

(2) Considérations de sécurité, en ce qui concerne le paiement et l'argent, cela doit être très sûr. Bien que je me plaigne également du SDK officiel, au moins il sera relativement sûr. Bien qu'aucun problème n'ait été trouvé pour le moment, ce serait mauvais s'il y avait des failles.

Cet article est toujours implémenté en utilisant la méthode remboursée() fournie dans WxPay.Api.php, le fichier de classe le plus important du SDK officiellement fourni. Cette méthode se trouve au n° 141 de WxPay.Api. php. OK, le code est le suivant :


/** 
 * 
 * 申请退款,WxPayRefund中out_trade_no、transaction_id至少填一个且 
 * 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; 
}

La méthode officielle indique clairement quels paramètres sont requis, et certains paramètres requis ont été renseignés par le SDK pour nous. Je le ferai. Cette méthode est reconditionnée pour faciliter l'appel au projet :


/** 
 * 微信退款 
 * @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; 
}

Je dois me plaindre ici, mais je ne mentionne même pas le type de valeur de retour. Ce qui est renvoyé lors du paiement, ce sont des données XML, ce qui est renvoyé ici est un tableau, ce qui m'a pris au dépourvu, haha, mais il est préférable de renvoyer un tableau, afin que je puisse le juger et le traiter directement. L'appel de la méthode

est encore plus simple :


//微信退款 
$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{ 
 //失败 
}

Un remboursement réussi sera renvoyé comme suit :

Le test personnel est correct : ceci est implémenté en intégrant le SDK officiel. Si vous n'utilisez pas le SDK, vous pouvez utiliser une méthode plus simple, voir : PHP pour implémenter le paiement WeChat (paiement jsapi) et le remboursement (pas besoin). pour intégrer le SDK de paiement)

Recommandations associées :

Explication détaillée du back-end PHP UnionPay exemples de paiement et de remboursement

WeChat partage des exemples de processus de paiement et de remboursement de mini-programmes

Explication détaillée du développement PHP pour implémenter la fonction de remboursement WeChat

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn