まず、支払い時に書き込まれたコールバック アドレスが正しいことを確認してください!!!!!!
書かれたコールバック アドレスが自分を指しているかどうかを必ず確認してください。内部にコールバック検証を記述するものです。後で戻ってエラーを見つけないでください。難しすぎます。
Alipay によってカプセル化された署名検証クラス、rsaCheckV1 を見つけます (これも app2.0 インターフェイスにあります)
これは、Alipay がカプセル化したクラスです: (推奨学習: PHP ビデオ チュートリアル )
/** rsaCheckV1 & rsaCheckV2<br/>* 验证签名<br/>* 在使用本方法前,必须初始化AopClient且传入公钥参数。<br/>* 公钥是否是读取字符串还是读取文件,是根据初始化传入的值判断的。<br/>**/<br/>public function rsaCheckV1($params, $rsaPublicKeyFilePath,$signType='RSA') {<br/>$sign = $params['sign'];<br/>$params['sign_type'] = null;<br/>$params['sign'] = null;<br/>$this->alipayrsaPublicKey = $rsaPublicKeyFilePath;<br/><br/>return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath,$signType);<br/>}<br/>public function rsaCheckV2($params, $rsaPublicKeyFilePath, $signType='RSA') {<br/>$sign = $params['sign'];<br/>$params['sign'] = null;<br/>return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath, $signType);<br/>}<br/>function verify($data, $sign, $rsaPublicKeyFilePath, $signType = 'RSA') {<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('支付宝RSA公钥错误。请检查公钥文件格式是否正确'); <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/>
また、これら 2 つを使用する 2 つのメソッドは混同されています。前者は、signtype を渡す必要がありますが、後者は渡しません (最初の 2 つのメソッドは 3 番目のメソッドを呼び出します)。もう 1 つの重要な点は、このメソッド自体がファイルから公開キーを抽出することです。この署名検証メソッドは、(bool) true または (bool) false を返し、署名検証が成功したかどうかを判断します。
# ここで 3 つの点に注意する必要があります:1—注意公钥的正确性,还有用的是支付宝公钥不是你当初生成的公钥<br/>2—区别这里的方法和支付宝接口本身方法的公钥获取方式<br/>3—注意接口方法本身的注释,很重要<br/>
Alipay のコールバック パラメータは投稿の形式で返されますが、テスト時にはアドレス バーにコールバック URL を直接書き込むことができます。次に、get メソッドを使用してそれを受け入れるため、パラメータを入力する必要はありません。結果は同じです (コールバック URL はログ ファイルに記録できます) 。署名を検証するときは、すべてのパラメータが返されます。署名は自動的に検証でき、ここでは必要なパラメーターを受け入れることができます。ここでは詳細には触れませんが、パラメーターを通常どおり受け入れるだけです。以下は、パラメータを確認するときに注文金額と販売者番号を確認するために使用するコードです。参考のためにのみ使用します (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('订单支付金额有误!');<br/> }<br/> //支付宝支付的所有参数<br/> $alipay_config = Config::get('alipay_config');<br/> if($app_id !== $alipay_config['appid']){<br/>// echo 2;<br/> return $this->log('商家编号有误!');<br/> }<br/> <br/> //验证收款商家是否正确<br/> if($seller_email !== $alipay_config['seller_id']){<br/>// echo 3;<br/> return $this->log('收款商家有误!');<br/> }<br/> return 'success';<br/> }<br/>
注文を確認する
こちら主なことは在庫を確認することです。ここではトランザクション処理を使用するのが最善です (ただし、注文量が必ずしもこの時点に戻るとは限りません)。私のコードは参考のためにのみ以下に示します (tp5):public function index($order_sn='')<br/> {<br/> if(isset($_POST['order_sn']) && empty($order_sn)){<br/> $order_sn = $_POST['order_sn'];<br/> }<br/> <br/> $table = self::order_info($order_sn);<br/> if($table == 'failure'){return 'false';}<br/> $oid = $table['order_id'];<br/> //通过订单id $oid 查询出订单中物品的id<br/> $goodsTable = Db::name('goods');<br/> $allgoods = Db::name("test1")->where('o_id', $oid)->field('g_id,g_num')->select();<br/> foreach ($allgoods as $k => $v) {<br/> //事务处理<br/> $goodsTable->startTrans();//事物开始<br/> try {<br/> //判断库存数量<br/> $goodsTable->query('update test2 set g_num = g_num-' . $v['g_num'] . ' where g_num >= ' . $v['g_num'] . ' and gid =' . $v['g_id']);<br/> <br/> } catch (\Exception $e) {<br/> $goodsTable->rollBack();//事物回滚<br/> }<br/> <br/> $goodsTable->commit();// 事物提交<br/> }<br/> <br/> //修改订单<br/> $res = Db::name('test3')->where('order_sn',$order_sn)->update(['order_state' => '1','pay_time'=>time()]);<br/> if($res != 0){<br/> return 'success';<br/> }<br/> }<br/>
以上がPHPでAlipayコールバックを記述する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。