1. 程式人生 > >php app支付寶回撥(非同步通知)

php app支付寶回撥(非同步通知)

之前寫過支付寶app支付的支付的後臺程式碼,現在來說一下非同步通知:

個人感覺支付寶的非同步通知,步驟比微信簡單點,但裡面的坑可是沒少多少,就一個驗籤就把我整的快瘋了….

非同步通知::

  • 1,先確定在支付的時候寫的回撥地址的正確性!!!!!!

  • 2.找到支付寶封裝的驗籤類,rsaCheckV1(這個也是在app2.0接口裡面)

  • 3.驗證回撥引數

  • *4.檢驗訂單

先確定在支付的時候寫的回撥地址的正確性!!!!!!

一定要確定回撥地址的寫的是否指到是你寫回調驗證的那個放裡面,別到時候在回頭找錯誤的時候,抓耳撓腮..

找到支付寶封裝的驗籤類,rsaCheckV1(這個也是在app2.0接口裡面)

這是支付寶已經封裝好的類:

/** 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—注意公鑰的正確性,還有用的是支付寶公鑰不是你當初生成的公鑰
2—區別這裡的方法和支付寶介面本身方法的公鑰獲取方式
3—注意介面方法本身的註釋,很重要

驗證回撥引數

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

檢驗訂單

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

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

還有就是在出錯後和在找bug的時候都平心靜氣一些,理智的找問題才會更快的找到問題 ( 如果實在不行就去找支付寶的人工支援,他會為你除錯你的程式碼,會給出一個差不多的結論,然後你再去改就會容易很多 :) ).

最後希望大家支付,回撥都可以成功!

相關推薦

php app支付(非同步通知)

之前寫過支付寶app支付的支付的後臺程式碼,現在來說一下非同步通知: 個人感覺支付寶的非同步通知,步驟比微信簡單點,但裡面的坑可是沒少多少,就一個驗籤就把我整的快瘋了…. 非同步通知:: 1,先確定在支付的時候寫的回撥地址的正確性!!!!!! 2.找到支

PHP服務端整合支付APP支付以及

說到支付寶APP支付,相對於微信APP支付要簡單一點,下篇會具體說微信APP支付的具體接入; 流程:客戶端提供資料 ->  服務端處理生成支付引數返回給客戶端調起支付  ->  支付成功  ->  支付寶回撥結果  ->  接受回撥修改訂單狀態 首先

支付通知怎麼處理才能保證結果不丟失

問題背景 現在的應用系統功能越來越多,複雜度也相應增大,而線上商城大都是分散式環境的,在商城系統中怎麼保證支付寶的非同步通知一定會被正確處理。 解決方案 大家都知道 * pu

26、【支付模組開發】——支付函式實現和查詢使用者訂單狀態介面編寫

####1、支付寶回撥函式實現 我們在除錯支付寶沙箱環境的時候,支護寶會有一個回撥函式,也就是在支付成功之後,可以呼叫我們支付之後需要執行的相關方法,從而達到資料庫的資料和我們的操作相統一。 首先我們先在本地將回調函式編寫好~ 在OrderController類中新建我們的支付寶回撥函式

支付驗籤失敗解決辦法

按照支付寶的文件,呼叫rsaCheckV1的方法,他已經把方法封裝的很透徹了,只需要將取到的引數Map(request.getParameterMap())集合放入即可。但是驗籤一直不通過,查了很多資料,說公鑰不對,應該使用支付寶公鑰,不是應用公鑰,修改之後,還是驗籤不通過。

支付驗籤錯誤 false

支付寶支付使用的是RSA非對稱加密,商戶服務端驗籤為支付寶的公鑰! 檢視入參,出參是否亂碼,若亂碼設定客戶端初始化時請求url為:https://openapi.alipay.com/gateway.do?charset=utf-8

SpringMVC下微信、支付一直進行非同步通知

ResponseBody和Json轉換器對微信、支付寶非同步通知的影響 一、現象 寫好非同步通知程式碼後,測試時發現支付寶以及微信在進行非同步通知時都在一直髮送訊息,說明我們返回的“成功”它們沒有收

微信app支付多次以及不的解決辦法

前面一篇文章我是在做app支付的時候寫的,做app支付完成之後寫的,這篇主要是支付完成之後的坑。 首先,支付完成之後,主要就是回撥,我首先遇到的就是支付完成之後,並沒有收到資訊,然後就是各種網上找問答。後面突然發現,資料庫裡面無緣無故的竟然有了回撥的資訊(這個我是在回撥頁面

支付問題

今天在看專案日誌的時候發現的問題,專案已經上線3個月了,突然發現在支付寶回撥介面被呼叫,呼叫的訂單號是3個月之前的訂單號。通過查詢才知道原來支付寶的一個訂單會有兩個回撥。 第一個回撥是在支付成功之後的回撥, 第二個是這個訂單支付成功3個月之後的回撥。 第一個返回

微信APP支付一直問題 求解決

/** * 微信非同步通知 * @author 王柯 <[email protected]> * @return void */ public function WxPayNotify() { require_once EXTEND_PAT

支付驗證簽名失敗

       回撥介面是支援掃碼支付方式的回撥的,最近業務需要又需要支援移動app的支付方式,回撥時卻簽名驗證失敗。在排除程式碼、引數、編碼格式等問題後,最終確定是支付寶這兩種支付方式回撥使用的支付寶公鑰不一樣導致的(好坑)。 記錄如下: 掃碼付,使用的是

關於支付即時到賬介面支付成功之後,支付商戶介面時因session失效而導致操作無法執行的問題

前兩天測試提交了一個很嚴重的bug,說是web前端呼叫支付寶二維碼掃碼支付成功之後,當網頁從支付寶頁面跳轉到我們自己網站頁面時session失效提示重新登入,如下圖: 原因是我的專案用了spring+shiro框架,session失效導致請求被攔截,附上攔截器的部分程式

支付介面非同步通知 伺服器的原因

已經設定了  notify_url的值為  用的是 TP框架    除錯後發現根本不通知該地址     查了支付寶文件 也沒對 notify_url有任何說明  後來發現  notify_url 值不能有 &  坑爹的支付寶介面

App支付H5支付函式編寫記錄

記錄一下從零開始開發App支付寶H5支付的回撥函式的過程。 系統環境:64位Win10 JDK版本:1.8.0_181 思路:搭建Java環境,編寫簡單的Web專案,用Servlet實現介面功能。 1,下載安

PHPPHP服務端支付支付

支付寶支付 (由app端自行調起支付寶/微信) <?php define('IN_ECS', true); /*App支付 PHP服務端*/ /*引入支付寶PHP SDK*/ header("Content-type:text/html;charset=ut

微信支付開發本地接收非同步通知【實戰】

前言 最近在除錯微信相關的介面,但是由於微信官方出於安全的考慮,對於呼叫介面的域名有限制。微信授權與微信支付統一下單介面在本地

PHP----------支付支付的一些註意事項。該博客只適用於20180209之後,的app支付支付

php src 支付寶支付 分享 bsp image http post 公鑰 1、簽名方式: 2、設置應用公鑰。也就是開發者公鑰。 PHP----------支付寶支付的一些註意事項。該博客只適用於20180209之後,的app支付寶支付。

支付支付】掃碼付和app支付調驗證簽名失敗問題

界面 排序 div nbsp 參數 解碼 app支付 bsp api 在檢查了參數排序,編碼解碼,文件編碼等問題後,發現還是簽名失敗,最後找出原因: 掃碼付和app支付采用的支付寶公鑰不一樣 Pid和公鑰管理裏面: 開放平臺密鑰界面和開放平臺應用界面的密鑰應該一致,

php對接App支付支付流程

php 對接 App 支付寶支付流程 剛做php和App支付的時候,看了好多文件雖然流程都OK, 但實際操作還有很多小問題的,特意整合一下,來提醒自己 ,也為那些正在迷茫的小夥伴提供些資料。我們這裡主要是利用 沙箱環境 測試的。 沙箱配置參考部落格原址:ht

php處理蘋果支付介面

需求:公司開發了一個應用,接入了蘋果支付(其實是AppStore內支付,因為是虛擬商品,所有不能直接接入app pay),客戶端做好了,要PHP(我)對接支付回撥介面,處理支付後的業務邏輯(修改訂單狀態,傳送簡訊通知客戶,修改使用者購買的套餐)。 接入AppS