1. 程式人生 > >支付寶支付之從前臺打通到後臺(二)

支付寶支付之從前臺打通到後臺(二)

上一篇我們說到客戶端在支付的時候,首先得拿著自己的支付資訊去後臺拿支付簽名,然後通過客戶端的PayTask來完成支付,雖然這些步驟看起來都挺簡單的,然而,這都只是對客戶端而言,對於服務端來說,要做很多很多。

今天我們可能都是在講服務端是怎麼操作的,因為客戶端就是上一篇說的那些了,你只要獲取簽名和支付,其他的什麼都不要你幹,所以,客戶端開發的就不要罵後端的介面是怎麼回事了,混口飯的都不容易。

從支付寶文件來看,我們在客戶端發起支付的時候,首先要去服務端拿簽名好的資訊,在這個簽名的過程中,我們設定了一個非同步回撥的地址,如下

$request->setNotifyUrl("商戶外網可以訪問的非同步地址"
);

這個回撥也是按照支付寶的文件請求來的,客戶端支付成功需要通過非同步通知來告知伺服器結果,而這個回撥是支付去請求的,無需使用者去手動求情,這個地址需要是一個外網的地址,以確保支付寶能訪問的到(本地localhost當然是不行的啦,這一步必須在服務端去完成,不然,支付寶找不到你的地址),支付寶只有在支付成功的時候才會去回撥這個地址,然後支付寶會帶著你客戶端支付成功的資訊去非同步回撥地址去驗籤,這個過程就是為了安全起見,如果驗籤成功,我們可以在成功的時候做一些處理,比如,更改服務端儲存的訂單狀態、獲取支付的使用者等等

我們來看看非同步通知的程式碼。

$aop = new AopClient;
$aop
->alipayrsaPublicKey = '支付寶的公鑰'; $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");

程式碼並不多,但是卻是非常的好用,上面需要填寫支付寶的公鑰,並不是我們用工具生成的那個公鑰哦,我這裡使用的是沙箱的環境,檢視紅色箭頭的那個支付寶公鑰,設定到上面的程式碼處。

這裡寫圖片描述

這個時候,我們還需要做一些事情,我們在支付成功後,支付寶呼叫這個地址,可是我們不知道支付寶是什麼時候呼叫的,我們首先來測試一下,看看支付寶到底返回了些啥,我們把程式碼重新增加一點,如下。

$myfile = fopen("testfile.txt"
, "w"); $aop = new AopClient; $aop->alipayrsaPublicKey = '支付寶的公鑰'; $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2"); if($flag){ fwrite($myfile, "true"); }else{ fwrite($myfile, "false"); } if(!empty($_POST)) fwrite($myfile, json_encode($_POST)); fclose($myfile);

我們在支付成功後,讓後臺把支付寶請求的資訊儲存到檔案裡面,這時候我們來請求一下看看檔案裡面是啥。

true
{
    "total_amount": "10.00",
    "buyer_id": "2088102170452295",
    "trade_no": "2017041521001004290200139873",
    "body": "\u661f\u5e01\u5145\u503c",
    "notify_time": "2017-04-15 21:33:46",
    "subject": "\u661f\u5e01\u5145\u503c",
    "sign_type": "RSA2",
    "buyer_logon_id": "pgp***@sandbox.com",
    "auth_app_id": "2016180300158116",
    "charset": "UTF-8",
    "notify_type": "trade_status_sync",
    "invoice_amount": "10.00",
    "out_trade_no": "G415630134174627",
    "trade_status": "TRADE_SUCCESS",
    "gmt_payment": "2017-04-15 21:33:45",
    "version": "1.0",
    "point_amount": "0.00",
    "sign": "LNKrpemGTJ4Byyk5ZKIFBDms8tnrFzanKVNSSFUMFBNXi8tacKAtb0BdM5L63Fp+YCK9Krz4zeuigG2MVlQufSygemACOx1AJKW8w8NgIy5738NepepheBBItMWJw8rr3mPA3nHqD\/4BEC+0uhTyqENSiBbz2yv7\/5qg6TLFqtWqQFEefgPCDG4wM0\/dh3HA8XGjbau7\/3Q1zePbYU2lbqqcZW9DR7XwmAp3JIufrHKWJ88XRR+YwQX2033sh9bf9WysEq4gOqpMexViHcNcC2LrPWlusbdcaHECnX8T+qIUlPLZaU84ZM6fyqPGfoz5S1\/bupMQfblJgd0YRIJdTQ==",
    "gmt_create": "2017-04-15 21:33:44",
    "buyer_pay_amount": "10.00",
    "receipt_amount": "10.00",
    "fund_bill_list": "[{\"amount\":\"10.00\",\"fundChannel\":\"ALIPAYACCOUNT\"}]",
    "app_id": "2016080300158116",
    "seller_id": "2088102169776678",
    "notify_id": "334bb5366412b8531a69d356d2786fdi8m",
    "seller_email": "[email protected]"
}

可以看到,檔案中返回的flag是true,就說明這個請求驗籤是正確的。並且支付寶請求這個非同步連結的時候是通過post把資料帶過來,然後驗證,這個時候,我們可以在$flag驗證為true的情況下做一些服務端想儲存的一些資訊,如上是所有POST的資訊了。

這時候,我們幾乎完成整個流程了,我們再把思路理一理,加上一些資料的儲存操作,我們在獲取簽名的時候,我們可以把使用者支付的資訊儲存在資料庫表裡面,比如訂單號,訂單價格,訂單狀態,訂單時間等等,然後再返回給使用者簽名信息,使用者在支付成功的時候,支付寶開始非同步回撥,我們在非同步回撥的地址中進行驗籤,如果驗籤成功,我們拿著訂單號去資料庫表裡面去找原來的那條訂單資訊,並更新訂單狀態為已支付。

整體就這麼多了

相關推薦

OPENCVcalibrateCamera到solvePnP

接上一篇。 看函式 第一個引數和第二個引數與上一篇類似,不過上一篇的是多幅圖的多組點,型別為雙重vector,這裡是一副圖中的一組點,型別為單重vector。 vector<Point3f> calcBoardCornerPositio

支付支付前臺打通後臺

上一篇我們說到客戶端在支付的時候,首先得拿著自己的支付資訊去後臺拿支付簽名,然後通過客戶端的PayTask來完成支付,雖然這些步驟看起來都挺簡單的,然而,這都只是對客戶端而言,對於服務端來說,要做很多很多。 今天我們可能都是在講服務端是怎麼操作的,因為客戶端就

MAC OS開發入門到崩潰

bsp 運行 shee 相關 .com nsh 彈出 add 區域 本文目標:通過xcode,創建一個Mac app程序。點擊按鈕,彈出Hello World窗口,其效果如下。 我們可以通過4個步驟來實現如上效果。 1.創建一個MAC app工程項目。 2.布局“按鈕”

SpringBootJava到Gotlin混用-1

SpringBoot之從Java到Kotlin(混用)-1介紹第一篇部落格環境及版本開始小結 介紹 第一篇部落格 一直不知道記些什麼,恰好最近看了下Kotlin,打算實際使用一番,就拿前一段自己基於SpringCloud搭建了一套後臺程式試手吧,記錄由Java改

python爬蟲入門到放棄爬蟲的原理

在上文中我們說了:爬蟲就是請求網站並提取資料的自動化程式。其中請求,提取,自動化是爬蟲的關鍵!下面我們分析爬蟲的基本流程爬蟲的基本流程發起請求通過HTTP庫向目標站點發起請求,也就是傳送一個Request,請求可以包含額外的header等資訊,等待伺服器響應獲取響應內容如果伺服器能正常響應,會得到一個Resp

Docker最全教程使用Tencent Hub來完成CI(九 Docker最全教程——理論到實戰(一) Docker最全教程——理論到實戰(二) Docker最全教程——理論到實戰 Docker最全教程——理論到實戰 Docker最全教程——理論到實戰 Docker最

原文: Docker最全教程之使用Tencent Hub來完成CI(九) 使用Tencent Hub來完成CI 關於Tencent Hub Tencent Hub是騰訊出品的DevOps服務。主要提供多儲存格式的版本管理,支援Docker Image、Binary、Helm Charts 等多種型別檔案

uboot.2015.07移植NAND Flash啟動5

移植u-boot-2015.07之修改程式支援NAND Flash 1.為什麼要支援NAND Flash啟動 由於NAND Flash 的儲存空間大並且價格便宜(相對於 NOR Flash 來說),所以程式的儲存位置一般會放在 NAND FLash 裡面

flutter零開始搭建 網路請求

專案還是在原來的基礎上搭建,具體的可以看上面的連線 這次,我們來介紹下網路請求,並且將請求到的資料設定到ListView列表中。老規矩,先來看下效果圖 頁面看起來不錯吧,在動手之前還是得說一下,首頁資料來自wanandroid提供,畢竟用了別人的

MVC排球比賽計分程序 ——架構概要設計

重要 cor 擴展 arch 接收 strong 這樣的 images 軟件 本程序主要基於MVC4框架,使應用程序的輸入,處理和輸出強制性分開,使得軟件可維護性,可擴展性,靈活性以及封裝性得到提高, MVC應用程序分為三個核心部件:Model,View, Controll

Centos 7.0 編譯安裝LAMPLinxu+apache+mysql+php源碼安裝Mysql

php mysql apache mysql 簡介: MySQL是一個關系型數據庫管理系統,關系數據庫將數據保存在不同的表中,這樣就增加了速度並提高了靈活性。目前其屬於 Oracle 旗下產品。MySQL 是最流行的關系型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RD

haproxy高可用非搶占keepalived

keepalived haproxy高可用 非搶占1、安裝keepalivedyum install keepalived2、編輯配置文件 /etc/keepalived/keepalived.conf主:global_defs { notification_email { [emai

深入淺出正則表達式

規則 方法 else 解決辦法。 test 開啟 spa 多次 前言 前言: 本文是前一片文章《深入淺出之正則表達式(一)》的續篇,在本文中講述了正則表達式中的組與向後引用,先前向後查看,條件測試,單詞邊界,選擇符等表達式及例子,並分析了正則引擎在執行匹配時的內

Android入門文件系統操作文件操作相關指令

-h tools strong abc his art 為什麽 重命名 path (一)獲取總根 [java] view plain copy File[] fileList=File.listRoots(); //返回fileList.length為1 /

反射入門到精通

char tostring import host res substring bject getc i++ 1. 通過反射動態生成SQL語句 Customer.java package com.xuzhiwen.reflect; public class Custom

Docker入門到實戰

Docker 虛擬化 一步一步走,寫小白都能看懂的文章,將持續更新中,敬請期待!Docker從入門到實戰(二)一:什麽是dockerDocker是一個開源的應用容器引擎,開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到主流的Linux、macOS、Windows機器上,實現虛擬化。D

Java的設計模式 簡單的工廠模式

attack reat nds public create mark mar ace cto 下面的代碼是稍微改進後的工廠模式 abstract class MoveAble{ public abstract void run(); } abstract c

按鈕配置自定義按鈕使用——JEPLUS軟件快速開發平臺

bottom vpd 開發平臺 rem 按鈕 ros cto -c spa JEPLUS按鈕配置之自定義按鈕使用(二)之前的一篇筆記講的是在列表上添加自定義按鈕來完成自己的業務需求,今天這篇筆記就主要講一下如何在表

node.js入門到放棄

簡單的 all == ons true nts 數值 定時 註冊 上章講了學習node,應該去學習什麽,對這些框架去進行學習現在咋們聊聊如何用原生來進行操作 主要來講一下events-事件觸發器 先來講一個簡單的實例 EventEmitter的實例,綁定一個監聽器。用

python-類-入門到精通

0.本文內容--繼承 在上一篇部落格中,講述了python3類的基本使用方法,本篇部落格著重介紹類的繼承特性。 在編寫類的時候,我們不一定都要從空白開始。如果我們正在編寫的類,實際上是另外一個已經存在的類的特殊版本,那麼我們就可以使用類的繼承。B類繼承A類後,B類將自動獲取A類的所有屬性和方

node總結全域性物件瞭解下

咱們接著上篇文章來看,process這個全域性變數,它是global物件的一個屬性,用於描述當前Node.js 程序狀態的物件,提供了一個與作業系統的簡單介面。通常在我們寫本地命令列程式的時候,少不了要 和它打交道。咱們來看下 process 物件的一些最常用的成員方法: