Maison  >  Article  >  développement back-end  >  Comment écrire un rappel Alipay en php

Comment écrire un rappel Alipay en php

(*-*)浩
(*-*)浩original
2019-09-05 09:56:533969parcourir

Assurez-vous d'abord que l'adresse de rappel inscrite lors du paiement est correcte !!!!!!

Assurez-vous que l'adresse de rappel fait référence à vous. qui écrit la vérification de rappel à l'intérieur. Ne revenez pas en arrière et trouvez l'erreur plus tard. Dans l'interface app2.0)

Voici la classe qu'Alipay a encapsulée : (Apprentissage recommandé : Comment écrire un rappel Alipay en phpTutoriel vidéo PHP

)

/** 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/>

De plus, n'utilisez pas ces deux méthodes. Les deux méthodes sont confuses. La première doit transmettre le type de signe, mais la seconde ne le fait pas (les deux premières méthodes appelleront. la troisième méthode). Un autre point important est que cette méthode extrait elle-même la clé publique du fichier, mais elle est transmise directement, j'ai donc légèrement modifié cette méthode pour qu'elle puisse lire directement la clé publique que j'ai transmise. renvoie (bool) true ou (bool) false pour déterminer si la vérification de la signature est réussie

Trois points à noter ici :

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

Les paramètres de rappel d'Alipay sont renvoyés sous la forme de. post, mais lors des tests, nous pouvons écrire l'URL de rappel directement dans la barre d'adresse, puis utiliser la méthode get pour l'accepter, il n'est donc pas nécessaire d'épeler les paramètres, le résultat est le même (l'URL de rappel peut être enregistré dans le fichier journal)

, et lors de la vérification de la signature, tous les paramètres de retour doivent être intacts. Vous pouvez le déplacer pour vérifier la signature, et vous pouvez simplement accepter les paramètres dont vous avez besoin ici. Je n'entrerai pas dans les détails. ici, il s'agit simplement d'accepter les paramètres normalement. Le code que j'utilise pour vérifier le montant de la commande et le numéro de commerçant lors de la vérification des paramètres est donné ci-dessous, à titre indicatif uniquement (j'utilise 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/>

Vérifier la commande

Ici L'essentiel est de vérifier l'inventaire. Il est préférable d'utiliser le traitement des transactions ici (même si votre volume de commandes ne revient pas nécessairement à ce point. Mon code est donné ci-dessous à titre de référence uniquement (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/>
. Ensuite, renvoyez simplement le résultat à Alipay. Échec : retournez "échec" ; succès : retournez "succès" et cela se termine ici.

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