> 백엔드 개발 > PHP 문제 > PHP에서 Alipay 콜백을 작성하는 방법

PHP에서 Alipay 콜백을 작성하는 방법

(*-*)浩
풀어 주다: 2023-02-23 16:28:02
원래의
4006명이 탐색했습니다.

먼저 결제 시 기재한 콜백 주소가 맞는지 확인하세요!!!!!!

콜백 주소가 콜백 인증을 작성한 주소와 일치하는지 꼭 확인하시고, 거기에 넣지 마세요. 그러면 오류를 다시 찾아보기가 너무 어렵습니다...

PHP에서 Alipay 콜백을 작성하는 방법

Alipay가 캡슐화한 서명 확인 클래스인 rsaCheckV1을 찾으세요(이것은 app2.0 인터페이스에도 있습니다)

Alipay가 캡슐화한 클래스입니다: ( 추천 학습: 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/>
로그인 후 복사

또한 이 두 가지 방법을 혼동하지 마세요. 전자는 signtype을 전달해야 하지만 후자는 그렇지 않습니다(처음 두 방법은 세 번째 방법을 호출합니다). 이 메서드 자체는 파일에서 공개 키를 추출하지만 직접 전달했기 때문에 내가 전달한 공개 키를 직접 읽을 수 있도록 이 메서드를 약간 변경했습니다. 이 서명 확인 메서드가 반환하는 것은 ( 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(&#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/>
로그인 후 복사

주문 확인

여기의 주요 목적은 재고를 확인하는 것입니다. 여기에서 거래 처리를 사용합니다. (주문량이 반드시 이 시점으로 반환되지는 않지만) 아래에 참조용으로 제 코드가 제공됩니다(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/>
로그인 후 복사

다음 단계는 결과를 Alipay에 반환하는 것입니다. 실패'; 성공: '성공'을 반환합니다.

위 내용은 PHP에서 Alipay 콜백을 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿