>  기사  >  백엔드 개발  >  Alipay 앱 결제 및 비동기 알림을 구현하는 PHP 코드 예제

Alipay 앱 결제 및 비동기 알림을 구현하는 PHP 코드 예제

不言
不言원래의
2018-07-26 11:13:423106검색

이 글의 내용은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.