이 글의 내용은 PHP에서 Alipay 앱 결제 및 비동기 알림을 구현하는 코드 예제를 공유하는 것입니다. 내용이 매우 자세하므로 도움이 필요한 친구에게 도움이 되기를 바랍니다.
이전에 Alipay 앱 결제를 위한 결제 백엔드 코드를 작성한 적이 있습니다. 이제 비동기 알림에 대해 이야기하겠습니다.
개인적으로 Alipay의 비동기 알림 단계는 WeChat보다 간단하다고 생각하지만 함정은 많지 않습니다. . 그냥 서명 인증이라니 미치네요...
비동기 알림:
1. 먼저 결제할 때 적힌 콜백 주소가 맞는지 확인하세요!!!!!!
2. Alipay, rsaCheckV1로 캡슐화된 클래스(app2.0 인터페이스에도 있음)
3. 콜백 매개변수 확인
*4. 주문 확인
먼저 결제 시 작성한 콜백 주소가 올바른지 확인하세요!!! !!!
콜백 주소가 콜백 인증을 작성한 주소인지 꼭 확인하고 넣어주세요. 뒤돌아서 오류를 찾을 때 머리 긁지 마세요..
찾아보세요. Alipay로 캡슐화된 서명 확인 클래스, rsaCheckV1(app2.0 인터페이스에도 있음)
이것은 Alipay가 캡슐화한 클래스입니다:
/** rsaCheckV1 & rsaCheckV2 * 验证签名 * 在使用本方法前,必须初始化AopClient且传入公钥参数。 * 公钥是否是读取字符串还是读取文件,是根据初始化传入的值判断的。 **/ public function rsaCheckV1($params, $rsaPublicKeyFilePath,$signType='RSA') { $sign = $params['sign']; $params['sign_type'] = null; $params['sign'] = null; $this->alipayrsaPublicKey = $rsaPublicKeyFilePath; return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath,$signType); } public function rsaCheckV2($params, $rsaPublicKeyFilePath, $signType='RSA') { $sign = $params['sign']; $params['sign'] = null; return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath, $signType); } function verify($data, $sign, $rsaPublicKeyFilePath, $signType = 'RSA') { if($this->checkEmpty($this->alipayPublicKey)){ $pubKey= $this->alipayrsaPublicKey; $res = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($pubKey, 64, "\n", true) . "\n-----END PUBLIC KEY-----"; }else { //读取公钥文件 $pubKey = file_get_contents($rsaPublicKeyFilePath); //转换为openssl格式密钥 $res = openssl_get_publickey($pubKey); } ($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确'); //调用openssl内置方法验签,返回bool值 if ("RSA2" == $signType) { $result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256); } else { $result = (bool)openssl_verify($data, base64_decode($sign), $res); } if(!$this->checkEmpty($this->alipayPublicKey)) { //释放资源 openssl_free_key($res); } return $result; }
또한 이 두 가지 방법을 혼동하지 마십시오. signtype을 전달해야 하는데 후자는 그렇지 않습니다.(처음 두 개의 각 메소드는 세 번째 메소드를 호출합니다.) 또 다른 중요한 점은 이 메소드 자체가 파일에서 공개 키를 추출하지만 직접 전달했기 때문에 이것을 약간 변경했습니다. 내가 전달한 공개 키를 직접 읽도록 하는 방법입니다. 이 서명 확인 방법은 서명 확인이 성공했는지 확인하기 위해 (bool) true 또는 (bool) false를 반환합니다.
여기서 주의할 세 가지 사항:
1—주의하세요. 공개 키 정확성, 또한 유용한 점은 Alipay 공개 키가 원래 생성한 공개 키가 아니라는 것입니다.
2 — 여기의 방법과 Alipay 인터페이스 자체의 공개 키 획득 방법의 차이점
3 — 댓글에 주의하세요 인터페이스 메소드 자체에서는 매우 중요합니다
확인 콜백 매개변수
Alipay의 콜백 매개변수는 게시물 형식으로 반환되지만 테스트할 때 주소 표시줄에 콜백 URL을 직접 작성한 다음 수락할 수 있습니다. get 메소드를 사용하므로 매개변수의 철자를 입력할 필요가 없습니다. 결과는 동일하며(콜백 URL은 로그 파일에 기록될 수 있음) 서명을 확인할 때 모든 반환 매개변수가 그대로 유지되어야 확인됩니다. 여기서는 필요한 매개변수를 모두 받을 수 있습니다. 말할 것도 없이 매개변수를 받아들이는 일반적인 문제입니다. 참고용으로 매개변수를 확인할 때 주문 금액과 판매자 번호를 확인하는 데 사용하는 코드는 다음과 같습니다. only (저는 tp5를 사용합니다):
public function check($receipt_amount,$buyer_pay_amount,$order_price,$app_id,$seller_email){ if($receipt_amount !== $order_price || $buyer_pay_amount !== $order_price){ // echo 1; return $this->log('订单支付金额有误!'); } //支付宝支付的所有参数 $alipay_config = Config::get('alipay_config'); if($app_id !== $alipay_config['appid']){ // echo 2; return $this->log('商家编号有误!'); } //验证收款商家是否正确 if($seller_email !== $alipay_config['seller_id']){ // echo 3; return $this->log('收款商家有误!'); } return 'success'; }
test Order
여기서 가장 중요한 것은 여기에서 거래 처리를 사용하는 것이 가장 좋습니다(주문량이 반드시 이 시점으로 돌아오지는 않을 수도 있습니다). ). 내 코드는 참조용으로만 제공됩니다(tp5).
public function index($order_sn='') { if(isset($_POST['order_sn']) && empty($order_sn)){ $order_sn = $_POST['order_sn']; } $table = self::order_info($order_sn); if($table == 'failure'){return 'false';} $oid = $table['order_id']; //通过订单id $oid 查询出订单中物品的id $goodsTable = Db::name('goods'); $allgoods = Db::name("test1")->where('o_id', $oid)->field('g_id,g_num')->select(); foreach ($allgoods as $k => $v) { //事务处理 $goodsTable->startTrans();//事物开始 try { //判断库存数量 $goodsTable->query('update test2 set g_num = g_num-' . $v['g_num'] . ' where g_num >= ' . $v['g_num'] . ' and gid =' . $v['g_id']); } catch (\Exception $e) { $goodsTable->rollBack();//事物回滚 } $goodsTable->commit();// 事物提交 } //修改订单 $res = Db::name('test3')->where('order_sn',$order_sn)->update(['order_state' => '1','pay_time'=>time()]); if($res != 0){ return 'success'; } }
다음 단계는 결과를 Alipay에 반환하는 것입니다. 실패: '실패'를 반환하고 여기에 있습니다. .
또한, 실수한 후에나 버그를 찾을 때는 침착하십시오. 합리적으로 문제를 찾아야만 문제를 더 빨리 찾을 수 있습니다. (작동하지 않으면 Alipay의 수동 지원으로 이동하세요. 그는 당신을 위해 코드를 디버깅하고 비슷한 결론을 내리면 바꾸기가 더 쉬울 것입니다 :) ).
마지막으로 모두가 성공적인 결제와 콜백을 할 수 있기를 바랍니다!
관련 권장 사항:
Alipay 구현 방법 PHP의 APP 결제 기능(코드)
위 내용은 Alipay 앱 결제 및 비동기 알림을 구현하는 PHP 코드 예제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!