日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

php怎么看回调的异步通知的数据_php app支付宝回调(异步通知)详解

發(fā)布時(shí)間:2024/10/6 php 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php怎么看回调的异步通知的数据_php app支付宝回调(异步通知)详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前寫過(guò)支付寶app支付的支付的后臺(tái)代碼,現(xiàn)在來(lái)說(shuō)一下異步通知:

個(gè)人感覺支付寶的異步通知,步驟比微信簡(jiǎn)單點(diǎn),但里面的坑可是沒少多少,就一個(gè)驗(yàn)簽就把我整的快瘋了….

異步通知:

1,先確定在支付的時(shí)候?qū)懙幕卣{(diào)地址的正確性!!!!!!

2.找到支付寶封裝的驗(yàn)簽類,rsaCheckV1(這個(gè)也是在app2.0接口里面)

3.驗(yàn)證回調(diào)參數(shù)

*4.檢驗(yàn)訂單

先確定在支付的時(shí)候?qū)懙幕卣{(diào)地址的正確性!!!!!!

一定要確定回調(diào)地址的寫的是否指到是你寫回調(diào)驗(yàn)證的那個(gè)放里面,別到時(shí)候在回頭找錯(cuò)誤的時(shí)候,抓耳撓腮..

找到支付寶封裝的驗(yàn)簽類,rsaCheckV1(這個(gè)也是在app2.0接口里面)

這是支付寶已經(jīng)封裝好的類:

/** rsaCheckV1 & rsaCheckV2

* 驗(yàn)證簽名

* 在使用本方法前,必須初始化AopClient且傳入公鑰參數(shù)。

* 公鑰是否是讀取字符串還是讀取文件,是根據(jù)初始化傳入的值判斷的。

**/

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);

//轉(zhuǎn)換為openssl格式密鑰

$res = openssl_get_publickey($pubKey);

}

($res) or die('支付寶RSA公鑰錯(cuò)誤。請(qǐng)檢查公鑰文件格式是否正確');

//調(diào)用openssl內(nèi)置方法驗(yàn)簽,返回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;

}

還有就是別把這兩個(gè)方法混淆了,前者需要傳signtype,后者不需要(前面兩個(gè)方法都會(huì)調(diào)用第三個(gè)方法),還有一點(diǎn)很重要,就是這個(gè)方法的本身是從文件里面提取公鑰的的,但是本人是直接傳的,就把這個(gè)方法稍加改動(dòng)了一下,讓它直接讀取我傳的公鑰.這個(gè)驗(yàn)簽方法返回的是(bool)true或者(bool)false,來(lái)判斷驗(yàn)簽是否成功.

在這里要注意三點(diǎn):

1—注意公鑰的正確性,還有用的是支付寶公鑰不是你當(dāng)初生成的公鑰

2—區(qū)別這里的方法和支付寶接口本身方法的公鑰獲取方式

3—注意接口方法本身的注釋,很重要

驗(yàn)證回調(diào)參數(shù)

支付寶的回調(diào)參數(shù)是以post的方式回傳的,但是我們?cè)跍y(cè)試的時(shí)候可以直接把回調(diào)url直接寫在地址欄里面,然后用get方式接受,這樣就不用拼參數(shù)了,結(jié)果是一樣的(回調(diào)url可以記錄在log文件里面),還有就是驗(yàn)簽的時(shí)候需要所有的回傳參數(shù)原封不動(dòng)的去驗(yàn)簽,而這里自己需要什么參數(shù)就接收什么參數(shù)就可以,這里就不多說(shuō)了,就是正常的接受參數(shù)的問題.下面給出我在驗(yàn)證參數(shù)時(shí),檢驗(yàn)訂單金額和商家編號(hào)的代碼,僅做參考(我用的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('訂單支付金額有誤!');

}

//支付寶支付的所有參數(shù)

$alipay_config = Config::get('alipay_config');

if($app_id !== $alipay_config['appid']){

// echo 2;

return $this->log('商家編號(hào)有誤!');

}

//驗(yàn)證收款商家是否正確

if($seller_email !== $alipay_config['seller_id']){

// echo 3;

return $this->log('收款商家有誤!');

}

return 'success';

}

檢驗(yàn)訂單

這里主要就是檢驗(yàn)庫(kù)存,這里最好用事物處理,(雖然你的訂單量可能不一定回到這個(gè)地步),下面給出我的代碼,僅做參考(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'];

//通過(guò)訂單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) {

//事務(wù)處理

$goodsTable->startTrans();//事物開始

try {

//判斷庫(kù)存數(shù)量

$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';

}

}

接下來(lái)就是把結(jié)果返回給支付寶就可以,失敗:return ‘failure';成功:return ‘success';到這里就結(jié)束了.

還有就是在出錯(cuò)后和在找bug的時(shí)候都平心靜氣一些,理智的找問題才會(huì)更快的找到問題 ( 如果實(shí)在不行就去找支付寶的人工支持,他會(huì)為你調(diào)試你的代碼,會(huì)給出一個(gè)差不多的結(jié)論,然后你再去改就會(huì)容易很多 :) ).

最后希望大家支付,回調(diào)都可以成功!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

本條技術(shù)文章來(lái)源于互聯(lián)網(wǎng),如果無(wú)意侵犯您的權(quán)益請(qǐng)點(diǎn)擊此處反饋版權(quán)投訴

本文系統(tǒng)來(lái)源:php中文網(wǎng)

總結(jié)

以上是生活随笔為你收集整理的php怎么看回调的异步通知的数据_php app支付宝回调(异步通知)详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。