Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erläuterung der PHP-Hintergrundschnittstelle der App WeChat Payment
In diesem Artikel wird Ihnen die PHP (7.0)-Hintergrundzahlungs- und Rückrufschnittstelle der App WeChat Pay (2016.10.11) vorgestellt. Das Framework ist Thinkphp5.0: Ich hoffe, es kann Ihnen helfen.
Verschiedene Parameter des Kontos
Bestellinformationen
Prepay_id anfordern
* Zurück zur APP-Datenverarbeitung
WeChat-Rückruf
Bestellstatus ändern
BestellinformationenDie verschiedenen Parameter des Kontos sind wie folgt: Wenn WeChat eine App-Zahlung beantragt, wird eine E-Mail an Ihr Kontopostfach gesendet, in der die folgenden Informationen enthalten sind Die entsprechende WeChat-Zahlungszuordnung wird bei der Beantragung von App-Zahlungsberechtigungen zurückgegeben, und der SCHLÜSSEL muss vom Benutzer im Händler-Backend auf WeChat festgelegt werden 🎜>
/** * 格式化参数格式化成url参数 */ public function ToUrlParams() { $buff = ""; foreach ($this->values as $k => $v) { if($k != "sign" && $v != "" && !is_array($v)){ $buff .= $k . "=" . $v . "&"; } } $buff = trim($buff, "&"); return $buff; }
(Sie benötigen es erst später, $param = $this->request('Parametername ')); und dann die Bestellinformationen vorab speichern
$input = new \app\wxpay\WxPayUnifiedOrder();//这里引用微信的统一下单接口 $input->SetBody($data['gname']['g_name']);//商品或支付单简要描述 $input->SetAttach($data['gname']['g_name']);//置附加数据 $input->SetOut_trade_no($order_sn); // 商户订单号 $input->SetTotal_fee(intval($data['data']['order_price']*100)); $input->SetTime_start(date("YmdHis"));//订单生成时间 $input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间 $input->SetGoods_tag($data['gname']['g_name']); //商品标记 $input->SetNotify_url("http://www.weixin.qq.com/wxpay/notify.php"); // 支付成功后的回调地址, $input->SetTrade_type("APP"); $order = \app\wxpay\WxPayApi::unifiedOrder($input);return $order['prepay_id'];Hier ist die offizielle einheitliche Bestellschnittstellenbeschreibungsadresse von WeChat:
https:// pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
$info = array(); //账号的信息一般都放在配置文件里面,用到的地方也很多 $info['appid'] = config('APP_APPID'); $info['partnerid'] = config('APP_MCHID'); $info['package'] = config('APP_PACKAGE'); $info['noncestr'] = $this->random_number();//生成随机数,下面有生成实例,统一下单接口需要 $info['timestamp'] = time(); $info['prepayid'] = $prepay_id; $info['sign'] = self::_makeSign($info);//生成签名return $info;$info sind die Informationen, die der Kunde benötigt
Zufallszahleninstanz generieren
//生成随机数 public function random_number($len=21,$format='ALL' ){ $is_abc = $is_numer = 0; $password = $tmp =''; switch($format){ case 'ALL': $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; break; case 'CHAR': $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; break; case 'NUMBER': $chars='0123456789'; break; default : $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; break; } // www.jb51.net mt_srand((double)microtime()*1000000*getmypid()); while(strlen($password)<$len){ $tmp =substr($chars,(mt_rand()%strlen($chars)),1); if(($is_numer <> 1 && is_numeric($tmp) && $tmp >0 )|| $format == 'CHAR'){ $is_numer = 1; } if(($is_abc <> 1 && preg_match('/[a-zA-Z]/',$tmp)) || $format == 'NUMBER'){ $is_abc = 1; } $password.= $tmp; } if($is_numer <> 1 || $is_abc <> 1 || empty($password) ){ $password = $this->random_number($len,$format); } return $password; }WeChat-Rückruf Zahlungsergebnisbenachrichtigung notify.php (die Adresse hier ist die Rückrufadresse, die bei der Bestellung eingegeben wurde, WeChat hat sie bereits verpackt) , Dokument-Download-Adresse
http://mch.weixin.qq.com/wiki/doc/api/ jsapi.php?chapter=11_1
Tatsächlich besteht der Hauptcode dieser Seite nur aus zwei Zeilen
$notify = new PayNotifyCallBack(); $notify->Handle(false);Der größte Teil der Logik wird in der Handle-Funktion Datei WxPay.Notify.php verarbeitet[php] einfache Kopie anzeigen
final public function Handle($needSign = true) { $msg = "OK"; //当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败 $result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg); if($result == false){ $this->SetReturn_code("FAIL"); $this->SetReturn_msg($msg); $this->ReplyNotify(false); return; } else { //该分支在成功回调到NotifyCallBack方法,处理完成之后流程 $this->SetReturn_code("SUCCESS"); $this->SetReturn_msg("OK"); } $this->ReplyNotify($needSign); }Hauptcode:
[php] einfache Kopie anzeigen
$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);Tracking-Funktion Datei WxPay.Api.php benachrichtigen[php] einfache Kopie anzeigen
public static function notify($callback, &$msg) { //获取通知的数据 $xml = $GLOBALS['HTTP_RAW_POST_DATA']; //如果返回成功则验证签名 try { $result = WxPayResults::Init($xml); } catch (WxPayException $e){ $msg = $e->errorMessage(); return false; } return call_user_func($callback, $result); }Gay-Daten über $GLOBALS['HTTP_RAW_POST_DATA'] abrufen und dann die Init-Funktion verwenden, um die Signatur usw. zu überprüfen. Die Signaturüberprüfung ist erfolgreich und der Code wird ausgeführt.
Hier muss erklärt werden, dass PHP7 selbst kein $GLOBALS['HTTP_RAW_POST_DATA'] unterstützt. Sie können Baidu für die Details verwenden. Was ich sagen möchte ist, dass Sie file_get_contents('php:/ /input') verwenden können. Aus bestimmten Gründen lesen Sie bitte den folgenden Blog, der sehr detailliert ist (https://my.oschina.net/jiec/blog). /485359)
[php] einfache Kopie anzeigen
return call_user_func($callback, $result);Das heißt, eine Rückruffunktion wird aufgerufen, die NotifyCallBack()-Funktion und der Parameter $result werden in der NotifyCallBack-Funktion übergeben, die wir umgeschrieben haben Die NotifyProcess()-Funktion wird aufgerufen (diese Funktion wird in notify.php neu geschrieben) NotifyProcess() stellt fest, dass kein Problem vorliegt und setzt die zurückgegebenen XML-Informationen auf Erfolg [php] Sehen Sie sich die einfache Kopie an
$this->SetReturn_code("SUCCESS"); $this->SetReturn_msg("OK");und rufen Sie schließlich die Funktion this−>ReplyNotify(this−> ReplyNotify(needSign); echo success resultDie Funktion ReplyNotify muss einen Code ändern: [php] Klartext anzeigen
final private function ReplyNotify($needSign = true) { //如果需要签名 if($needSign == true && $this->GetReturn_code($return_code) == "SUCCESS") { $this->SetSign(); } WxpayApi::replyNotify($this->ToXml()); }[php] Klartext anzeigen
$this->GetReturn_code($return_code) == "SUCCESS")wird in [php] Klartext anzeigen geändert Kopieren
$this->GetReturn_code() == "SUCCESS")
Dann ändern Sie den Bestellstatus basierend auf den zurückgegebenen Informationen, hauptsächlich, wo geändert werden soll, ich habe eine neue Methode
//修改订单状态 public function updateState($data){ if($data){ $order_sn = $data['out_trade_no'];\ $data = array(); $data['order_id'] = $order_id; //修改订单状态(用curlpost方法请求至thinkphp目录下的Controller里面控制器里面的方法,修改状态) $url = 'www.test.com'; header('content-type:text/html;charset=utf8'); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $result = curl_exec($curl); curl_close($curl); if($result == 'success'){ return true; }else{ return false; } } }in notify.php erstellt und dann
unter
$notify = new PayNotifyCallBack(); $notify->Handle(false);
in notify.php hinzugefügt
//接受参数,修改状态 $xml = file_get_contents("php://input"); $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); $notify->updateState($data);
相关推荐:
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der PHP-Hintergrundschnittstelle der App WeChat Payment. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!