Heim  >  Artikel  >  Backend-Entwicklung  >  So schreiben Sie einen Alipay-Rückruf in PHP

So schreiben Sie einen Alipay-Rückruf in PHP

(*-*)浩
(*-*)浩Original
2019-09-05 09:56:533936Durchsuche

Stellen Sie zunächst sicher, dass die beim Bezahlen angegebene Rückrufadresse korrekt ist!!!

Stellen Sie sicher, dass sich die Rückrufadresse auf Sie bezieht Das schreibt die Rückrufüberprüfung nicht zurück und findet den Fehler später in der App2.0-Schnittstelle.)

Dies ist die Klasse, die Alipay gekapselt hat: So schreiben Sie einen Alipay-Rückruf in PHPPHP-Video-Tutorial

)

/** rsaCheckV1 & rsaCheckV2<br/>* 验证签名<br/>* 在使用本方法前,必须初始化AopClient且传入公钥参数。<br/>* 公钥是否是读取字符串还是读取文件,是根据初始化传入的值判断的。<br/>**/<br/>public function rsaCheckV1($params, $rsaPublicKeyFilePath,$signType=&#39;RSA&#39;) {<br/>$sign = $params[&#39;sign&#39;];<br/>$params[&#39;sign_type&#39;] = null;<br/>$params[&#39;sign&#39;] = null;<br/>$this->alipayrsaPublicKey = $rsaPublicKeyFilePath;<br/><br/>return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath,$signType);<br/>}<br/>public function rsaCheckV2($params, $rsaPublicKeyFilePath, $signType=&#39;RSA&#39;) {<br/>$sign = $params[&#39;sign&#39;];<br/>$params[&#39;sign&#39;] = null;<br/>return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath, $signType);<br/>}<br/>function verify($data, $sign, $rsaPublicKeyFilePath, $signType = &#39;RSA&#39;) {<br/><br/>if($this->checkEmpty($this->alipayPublicKey)){<br/><br/>$pubKey= $this->alipayrsaPublicKey;<br/>$res = "-----BEGIN PUBLIC KEY-----\n" .<br/>wordwrap($pubKey, 64, "\n", true) .<br/>"\n-----END PUBLIC KEY-----";<br/>}else {<br/>//读取公钥文件<br/>$pubKey = file_get_contents($rsaPublicKeyFilePath);<br/>//转换为openssl格式密钥<br/>$res = openssl_get_publickey($pubKey);<br/>}<br/><br/>($res) or die(&#39;支付宝RSA公钥错误。请检查公钥文件格式是否正确&#39;); <br/><br/>//调用openssl内置方法验签,返回bool值<br/>if ("RSA2" == $signType) {<br/>$result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);<br/>} else {<br/>$result = (bool)openssl_verify($data, base64_decode($sign), $res);<br/>}<br/><br/>if(!$this->checkEmpty($this->alipayPublicKey)) {<br/>//释放资源<br/>openssl_free_key($res);<br/>}<br/><br/>return $result;<br/>}L<br/>SQLite<br/>SQLite3<br/>SQLSRV <br/>Sybase<br/>tokyo_tyrant<br/>

Verwenden Sie diese beiden Methoden auch nicht. Die beiden Methoden sind verwechselt. Erstere muss signtype übergeben, letztere jedoch nicht (die ersten beiden Methoden werden aufgerufen). (Die dritte Methode) Ein weiterer wichtiger Punkt ist, dass diese Methode den öffentlichen Schlüssel selbst aus der Datei extrahiert, ihn aber direkt weitergibt. Daher habe ich diese Methode leicht geändert, sodass sie den öffentlichen Schlüssel, den ich übergeben habe, direkt lesen kann gibt (bool) true oder (bool) false zurück, um festzustellen, ob die Signaturüberprüfung erfolgreich war.

Hier sind drei Punkte zu beachten:

1—注意公钥的正确性,还有用的是支付宝公钥不是你当初生成的公钥<br/>2—区别这里的方法和支付宝接口本身方法的公钥获取方式<br/>3—注意接口方法本身的注释,很重要<br/>

Die Rückrufparameter von Alipay werden in der Form zurückgegeben Post, aber beim Testen können wir die Rückruf-URL direkt in die Adressleiste schreiben und sie dann mit der get-Methode akzeptieren, sodass die Parameter nicht buchstabiert werden müssen, das Ergebnis ist das gleiche (die Rückruf-URL kann sein). in der Protokolldatei aufgezeichnet)

, und bei der Überprüfung der Signatur müssen alle Rückgabeparameter intakt sein. Sie können es verschieben, um die Signatur zu überprüfen, und Sie können einfach alle Parameter akzeptieren, die Sie hier benötigen. Ich werde hier nicht auf Details eingehen Hier geht es nur darum, Parameter normal zu akzeptieren. Der Code, den ich verwende, um den Bestellbetrag und die Händlernummer bei der Überprüfung der Parameter zu überprüfen, ist unten angegeben und dient nur als Referenz (ich verwende tp5):

public function check($receipt_amount,$buyer_pay_amount,$order_price,$app_id,$seller_email){<br/>  if($receipt_amount !== $order_price || $buyer_pay_amount !== $order_price){<br/>//    echo 1;<br/>   return $this->log(&#39;订单支付金额有误!&#39;);<br/>  }<br/>  //支付宝支付的所有参数<br/>  $alipay_config = Config::get(&#39;alipay_config&#39;);<br/>  if($app_id !== $alipay_config[&#39;appid&#39;]){<br/>//   echo 2;<br/>    return $this->log(&#39;商家编号有误!&#39;);<br/>  }<br/> <br/>  //验证收款商家是否正确<br/>  if($seller_email !== $alipay_config[&#39;seller_id&#39;]){<br/>//   echo 3;<br/>   return $this->log(&#39;收款商家有误!&#39;);<br/>  }<br/>  return &#39;success&#39;;<br/> }<br/>

Bestellung prüfen

Hier Die Hauptsache ist, den Lagerbestand zu überprüfen (obwohl Ihr Bestellvolumen möglicherweise nicht unbedingt an diesen Punkt zurückkehrt) (tp5):

public function index($order_sn=&#39;&#39;)<br/> {<br/>  if(isset($_POST[&#39;order_sn&#39;]) && empty($order_sn)){<br/>   $order_sn = $_POST[&#39;order_sn&#39;];<br/>  }<br/> <br/>  $table = self::order_info($order_sn);<br/>  if($table == &#39;failure&#39;){return &#39;false&#39;;}<br/>  $oid = $table[&#39;order_id&#39;];<br/>  //通过订单id $oid 查询出订单中物品的id<br/>  $goodsTable = Db::name(&#39;goods&#39;);<br/>  $allgoods = Db::name("test1")->where(&#39;o_id&#39;, $oid)->field(&#39;g_id,g_num&#39;)->select();<br/>  foreach ($allgoods as $k => $v) {<br/>   //事务处理<br/>   $goodsTable->startTrans();//事物开始<br/>   try {<br/>    //判断库存数量<br/>    $goodsTable->query(&#39;update test2 set g_num = g_num-&#39; . $v[&#39;g_num&#39;] . &#39; where g_num >= &#39; . $v[&#39;g_num&#39;] . &#39; and gid =&#39; . $v[&#39;g_id&#39;]);<br/> <br/>   } catch (\Exception $e) {<br/>    $goodsTable->rollBack();//事物回滚<br/>   }<br/> <br/>   $goodsTable->commit();// 事物提交<br/>  }<br/> <br/>  //修改订单<br/>  $res = Db::name(&#39;test3&#39;)->where(&#39;order_sn&#39;,$order_sn)->update([&#39;order_state&#39; => &#39;1&#39;,&#39;pay_time&#39;=>time()]);<br/>  if($res != 0){<br/>   return &#39;success&#39;;<br/>  }<br/> }<br/>
Als nächstes geben Sie das Ergebnis einfach an Alipay zurück. Erfolg: Geben Sie „Erfolg“ zurück

Das obige ist der detaillierte Inhalt vonSo schreiben Sie einen Alipay-Rückruf in PHP. 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