php支付寶回調怎麼寫

(*-*)浩
發布: 2023-02-23 16:28:02
原創
3858 人瀏覽過

先確定在付款的時候寫的回呼地址的正確性!!!!!!

#一定要確定回呼地址的寫的是否指到是你寫回調驗證的那個放裡面,別到時候在回頭找錯誤的時候,太難了..

php支付寶回調怎麼寫

#找到支付寶封裝的驗簽類別,rsaCheckV1(這個也是在app2.0介面裡面)

這是支付寶已經封裝好的類別:(推薦學習: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,來判斷驗簽是否成功.

在這裡要注意三點:

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

支付寶的回呼參數是以post的方式回傳的,但是我們在測試的時候可以直接把回調url直接寫在網址列裡面,然後用get方式接受,這樣就不用拼參數了,結果是一樣的(回調url可以記錄在log檔裡面),還有就是驗籤的時候需要所有的回傳參數原封不動的去驗簽,而這裡自己需要什麼參數就接收什麼參數就可以,這裡就不多說了,就是正常的接受參數的問題。下面給出我在驗證參數時,檢驗訂單金額和商家編號的代碼,僅做參考(我用的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/>
登入後複製

接下來就是把結果回傳給支付寶就可以,失敗:return 'failure';成功:return 'success';到這裡就結束了.

以上是php支付寶回調怎麼寫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!