支付寶開發 - 掃碼支付

關鍵字:支付寶支付、支付寶掃碼支付php

 

1、支付場景

用戶使用支付寶錢包上的「掃一掃」功能,掃碼商戶針對每一個訂單實時生成的訂單二維碼,並在手機端確認支付。算法

2、調用流程

 2.1 支付寶掃碼支付調用流程json

   

    a. 商戶系統調用支付寶【預下單接口alipay.trade.precreate】,得到該訂單二維碼圖片地址。api

    b. 發起輪詢得到支付結果:等待5秒後調用【交易查詢接口alipay.trade.query】,經過支付時傳入的商戶訂單號(out_trade_no)查詢支付結果(返回參數TRADE_STATUS),若是仍然返回等待用戶付款(WAIT_BUYER_PAY),則再次等待5秒後繼續查詢,直到返回確切的支付結果(成功TRADE_SUCCESS或已撤銷關閉TRADE_CLOSED),或是超出輪詢時間。在最後一次查詢仍然返回等待用戶付款的狀況下,必須當即調用【交易撤銷接口alipay.trade.cancel】將這筆交易撤銷,避免用戶繼續支付。服務器

    c. 除了主動輪詢,也能夠經過接收異步通知得到支付結果,詳見掃碼異步通知,注意必定要對異步通知作驗證簽名,確保通知是支付寶發出的。cookie

 

3、參數格式

請求和接收均爲JSON格式session

4、接口地址

正式環境:https://openapi.alipay.com/gateway.doapp

沙箱測試環境:https://openapi.alipaydev.com/gateway.do異步

5、統一收單線下交易預建立

1.請求參數

公共參數工具

參數

類型

必填

最大長度

示例值

描述

app_id

String

32

2014072300007148

支付寶分配給開發者的應用ID

method

String

128

接口名稱

alipay.trade.precreate

format

String

40

僅支持JSON

JSON

charset

String

10

utf-8

請求使用的編碼格式,如utf-8,gbk,gb2312等

sign_type

String

10

RSA2

商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA2和RSA,推薦使用RSA2

sign

String

256

詳見示例

商戶請求參數的簽名串,詳見簽名

timestamp

String

19

2014-07-24 03:07:50

發送請求的時間,格式"yyyy-MM-dd HH:mm:ss"

version

String

3

1.0

調用的接口版本,固定爲:1.0

notify_url

String

256

http://api.test.alipay.net/atinterface/receive_notify.htm

支付寶服務器主動通知商戶服務器裏指定的頁面http/https路徑。

app_auth_token

String

40

 

 

biz_content

String

-

 

請求參數的集合,最大長度不限,除公共參數外全部請求參數都必須放在這個參數中傳遞,具體參照各產品快速接入文檔

 

請求參數(如下只列出了必填參數及少數重要選填參數)

 

參數

類型

必填

最大長度

示例值

描述

out_trade_no

String

必須

64

20150320010101001

商戶訂單號,64個字符之內、只能包含字母、數字、下劃線;需保證在商戶端不重複

seller_id

String

可選

28

2088102146225135

賣家支付寶用戶ID。 若是該值爲空,則默認爲商戶簽約帳號對應的支付寶用戶ID

total_amount

Price

必須

11

88.88

訂單總金額,單位爲元,精確到小數點後兩位,取值範圍[0.01,100000000] 若是同時傳入了【打折金額】,【不可打折金額】,【訂單總金額】三者,則必須知足以下條件:【訂單總金額】=【打折金額】+【不可打折金額】

discountable_amount

Price

可選

11

88.88

可打折金額. 參與優惠計算的金額,單位爲元,精確到小數點後兩位,取值範圍[0.01,100000000] 若是該值未傳入,但傳入了【訂單總金額】,【不可打折金額】則該值默認爲【訂單總金額】-【不可打折金額】

buyer_logon_id

String

可選

100

15901825620

買家支付寶帳號

subject

String

必須

256

Iphone6 16G

訂單標題

body

String

可選

128

Iphone6 16G

對交易或商品的描述

goods_detail

GoodsDetail []

 

-

-

訂單包含的商品列表信息.Json格式. 其它說明詳見:「商品明細說明」

operator_id

String

可選

28

yx_001

商戶操做員編號

store_id

String

可選

32

NJ_001

商戶門店編號

terminal_id

String

可選

32

NJ_T_001

商戶機具終端編號

...更多參數,請移步支付寶開發者文檔中心:

https://doc.open.alipay.com/docs/api.htm?spm=a219a.7629065.0.0.5GZNbY&apiId=862&docType=4

 

2.返回參數

公共參數

參數

類型

必填

最大長度

示例值

描述

code

String

-

40004

 

msg

String

-

Business Failed

 

sub_code

String

-

ACQ.TRADE_HAS_SUCCESS

 

sub_msg

String

-

交易已被支付

 

sign

String

-

DZXh8eeTuAHoYE3w1J+POiPhfDxOYBfUNn1lkeT/V7P4zJdyojWEa6IZs6Hz0yDW5Cp/viufUb5I0/V5WENS3OYR8zRedqo6D+fUTdLHdc+EFyCkiQhBxIzgngPdPdfp1PIS7BdhhzrsZHbRqb7o4k3Dxc+AAnFauu4V6Zdwczo=

 

 

 

響應參數

參數

類型

必填

最大長度

示例值

描述

out_trade_no

String

必填

64

6823789339978248

商戶的訂單號

qr_code

String

必填

1024

https://qr.alipay.com/bavh4wjlxf12tper3a

當前預下單請求生成的二維碼碼串,能夠用二維碼生成工具根據該碼串值生成對應的二維碼

 

3.請求示例

 1 <?php
 2 $params = array(
 3     //公共參數
 4 
 5     'app_id' => '2016080200150898',
 6 
 7     'method' => 'alipay.trade.precreate',
 8 
 9     'format' => 'json',
10 
11     'charset' => 'utf-8',
12 
13     'sign_type' => 'RSA2'
14 
15     'timestamp' => '2017-03-31 15:53:42',
16 
17     'version' => '1.0',
18 
19     'notify_url' => 'http://www.xxxxx.com/notify_url.php',
20 
21     'biz_content' => '{"out_trade_no":1490946822,"total_amount":"0.01","subject":"\u6d4b\u8bd5\u5546\u54c1"}',
22 
23     'sign'=> 'idFoPOgosWazzgTjKj3MWVdICEw9mNQEj+mJr7TB8uhxacwcASlzN7Qfeqn7v6gncth/oV4uaZ8F2KBkBYenZb2563xJ+foYWFj2HZ8vhcdnVGYMl7U7SJ7jurjTKYOWqILDtIGDw8HcSFNNn+e3ryqMOJjc9neTSIXAqftFNojmHUGnEc9g7y4HH2pnXIri618jZ7wy2HfcpYd1JW5Ku46q+vAEHkTW9u4+hBQ37QwI10Gfi6c+aB21sabj2gjvyEdSHGdy3SbDHeinOM/CqEnw32ArfSfqjGVecJAkRwq/dXhqJlrIukED0scaT6sDepqcUZ2xSGbQMj2djByiqA==',
24 
25  
26     //請求參數
27 
28     'out_trade_no' => '1490946822',
29 
30     'total_amount' => '0.01',
31 
32     'subject' => '測試商品',
33 );

  a. 將公共參數按照URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA:

app_id=2016080200150898&method=alipay.trade.precreate&charset=utf-8&sign_type=RSA2×tamp=2017-03-31+16%3A09%3A34&version=1.0¬ify_url=http%3A%2F%2F10.10.19.39%2Fqhshop%2Fali_notify_url.php&format=json&biz_content=%7B%22out_trade_no%22%3A1490947774%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%22%5Cu6d4b%5Cu8bd5%5Cu5546%5Cu54c1%22%7D&sign=vAs%2Bpy%2BQWxed0qdHXEuuyz5VKGgvrMgy2v%2FK85zUg3lMe5YjJ7WC0OESdB4SHPh0r675wQ%2FPPpPPhE%2Bb%2BNGTGpS%2F49r3j6AodcytkYmP8%2FSadxTQ2ah0j0culPxdDmRRD0%2FzRXHWZOWS9s4K52k6XP0i6dGjAhVOP%2Ffh59SIuK8YWuzfLEAss6CSyv3BDs4RPQ%2FNVE6HFIJJRNBFKQTFoRIqeo9Oan3Pc%2BKhPhLzadjo811wj01MqEmXMc8aQ75wdjvnWm1FBBhZga1lHZ0wlpgbQb0hXyakhwlJFZNx4CBCAI%2Fl%2FVMKerTpp8%2F%2FJWTd6xd%2Fi96C6Pt8UQhIVWiYKQ%3D%3D

  b. 將字符串stringA拼接在接口地址後面,獲得新的URL地址

https://openapi.alipaydev.com/gateway.do?app_id=2016080200150898&method=alipay.trade.precreate&charset=utf-8&sign_type=RSA2×tamp=2017-03-31+16%3A09%3A34&version=1.0¬ify_url=http%3A%2F%2F10.10.19.39%2Fqhshop%2Fali_notify_url.php&format=json&biz_content=%7B%22out_trade_no%22%3A1490947774%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%22%5Cu6d4b%5Cu8bd5%5Cu5546%5Cu54c1%22%7D&sign=vAs%2Bpy%2BQWxed0qdHXEuuyz5VKGgvrMgy2v%2FK85zUg3lMe5YjJ7WC0OESdB4SHPh0r675wQ%2FPPpPPhE%2Bb%2BNGTGpS%2F49r3j6AodcytkYmP8%2FSadxTQ2ah0j0culPxdDmRRD0%2FzRXHWZOWS9s4K52k6XP0i6dGjAhVOP%2Ffh59SIuK8YWuzfLEAss6CSyv3BDs4RPQ%2FNVE6HFIJJRNBFKQTFoRIqeo9Oan3Pc%2BKhPhLzadjo811wj01MqEmXMc8aQ75wdjvnWm1FBBhZga1lHZ0wlpgbQb0hXyakhwlJFZNx4CBCAI%2Fl%2FVMKerTpp8%2F%2FJWTd6xd%2Fi96C6Pt8UQhIVWiYKQ%3D%3D

  c. 最後將請求參數post到新的URL地址;

 

4.返回示例

請求接口後,返回的數據格式爲JSON格式的字符串。

接口調用成功:

 

 

接口調用失敗:

 

6、支付結果通知

1. 說明

  a. 用戶經過手機掃碼二維碼進行支付,支付寶會將該筆訂單的變動信息,沿着商戶調用預下單請求時所傳入的通知地址notify_url主動推送給商戶。

  b. 支付寶使用POST方式發送通知信息,所以notify_url頁面中獲取參數的方式爲:$_POST[‘out_trade_no’];

  c. 程序執行完,若是交易付款成功必須打印輸出「success」(不包含引號)。不然支付寶服務器會不斷重發通知,直到24小時22分鐘。通常狀況下,25小時之內完成8次通知(通知的間隔頻率通常是:4m,10m,10m,1h,2h,6h,15h);

  d. cookie、session等在此頁面會失效,即沒法獲取這些數據;

 

2. 通知參數(部分重要參數)

參數

參數名稱

類型

必填

描述

範例

notify_time

通知時間

Date

通知的發送時間。格式爲yyyy-MM-dd HH:mm:ss

2015-14-27 15:45:58

notify_type

通知類型

String(64)

通知的類型

trade_status_sync

notify_id

通知校驗ID

String(128)

通知校驗ID

ac05099524730693a8b330c5ecf72da9786

sign_type

簽名類型

String(10)

商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA2和RSA,推薦使用RSA2

RSA2

sign

簽名

String(256)

請參考異步返回結果的驗籤

601510b7970e52cc63db0f44997cf70e

trade_no

支付寶交易號

String(64)

支付寶交易憑證號

2013112011001004330000121536

app_id

開發者的app_id

String(32)

支付寶分配給開發者的應用Id

2014072300007148

out_trade_no

商戶訂單號

String(64)

原支付請求的商戶訂單號

6823789339978248

seller_id

賣家支付寶用戶號

String(30)

賣家支付寶用戶號

2088101106499364

seller_email

賣家支付寶帳號

String(100)

賣家支付寶帳號

zhuzhanghu@alitest.com

trade_status

交易狀態

String(32)

交易目前所處的狀態

TRADE_CLOSED

total_amount

訂單金額

Number(9,2)

本次交易支付的訂單金額,單位爲人民幣(元)

20

receipt_amount

實收金額

Number(9,2)

商家在交易中實際收到的款項,單位爲元

15

subject

訂單標題

String(256)

商品的標題/交易標題/訂單標題/訂單關鍵字等,是請求時對應的參數,原樣通知回來

當面付交易

body

商品描述

String(400)

該訂單的備註、描述、明細等。對應請求時的body參數,原樣通知回來

當面付交易內容

...更多參數,請移步支付寶開發者文檔中心:

https://doc.open.alipay.com/docs/doc.htm?treeId=194&articleId=103296&docType=1

 

3. 簽名驗證

第一步: 在通知返回參數列表中,除去sign、sign_type兩個參數外,凡是通知返回回來的參數皆是待驗籤的參數。

 

第二步: 將剩下參數進行url_decode, 而後進行字典排序,組成字符串,獲得待簽名字符串:

 

第三步: 將簽名參數(sign)使用base64解碼爲字節碼串。

 

第四步: 使用RSA的驗籤方法,經過簽名字符串、簽名參數(通過base64解碼)及支付寶公鑰驗證簽名。

 

第五步:須要嚴格按照以下描述校驗通知數據的正確性:

   * 驗證該通知數據中的out_trade_no是否爲商戶系統中建立的訂單號;

   * 判斷total_amount是否確實爲該訂單的實際金額(即商戶訂單建立時的金額);

   * 校驗通知中的seller_id(或者seller_email) 是否爲out_trade_no這筆單據的對應的操做方(有的時候,一個商戶可能有多個seller_id/seller_email);

   * 在支付寶的業務通知中,只有交易通知狀態爲TRADE_SUCCESS或TRADE_FINISHED時,支付寶纔會認定爲買家付款成功;

 

4. 返回參數

支付成功則返回success」,不然返回其餘字符;

7、訂單查詢

該接口提供全部支付寶支付訂單的查詢,商戶能夠經過該接口主動查詢訂單狀態,完成下一步的業務邏輯。

1. 請求參數

公共參數

參數

類型

必填

最大長度

示例值

描述

app_id

String

32

2014072300007148

支付寶分配給開發者的應用ID

method

String

128

接口名稱

alipay.trade.query

format

String

40

僅支持JSON

JSON

charset

String

10

utf-8

請求使用的編碼格式,如utf-8,gbk,gb2312等

sign_type

String

10

RSA2

商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA2和RSA,推薦使用RSA2

sign

String

256

詳見示例

商戶請求參數的簽名串,詳見簽名

timestamp

String

19

2014-07-24 03:07:50

發送請求的時間,格式"yyyy-MM-dd HH:mm:ss"

version

String

3

1.0

調用的接口版本,固定爲:1.0

app_auth_token

String

40

 

 

biz_content

String

-

 

請求參數的集合,最大長度不限,除公共參數外全部請求參數都必須放在這個參數中傳遞,具體參照各產品快速接入文檔

 

請求參數

 

參數

類型

必填

最大長度

示例值

描述

out_trade_no

String

特殊可選

64

20150320010101001

訂單支付時傳入的商戶訂單號,和支付寶交易號不能同時爲空。 trade_no,out_trade_no若是同時存在優先取trade_no

trade_no

String

特殊可選

64

2014112611001004680 073956707

支付寶交易號,和商戶訂單號不能同時爲空

 

2. 返回參數

公共參數

參數

類型

必填

最大長度

示例值

描述

code

String

-

40004

 

msg

String

-

Business Failed

 

sub_code

String

-

ACQ.TRADE_HAS_SUCCESS

 

sub_msg

String

-

交易已被支付

 

sign

String

-

DZXh8eeTuAHoYE3w1J+POiPhfDxOYBfUNn1lkeT/V7P4zJdyojWEa6IZs6Hz0yDW5Cp/viufUb5I0/V5WENS3OYR8zRedqo6D+fUTdLHdc+EFyCkiQhBxIzgngPdPdfp1PIS7BdhhzrsZHbRqb7o4k3Dxc+AAnFauu4V6Zdwczo=

 

 

響應參數(如下只列出了必填參數及少數重要選填參數)

 

參數

類型

必填

最大長度

示例值

描述

trade_no

String

必填

64

2013112011001004330000121536

支付寶交易號

out_trade_no

String

必填

64

6823789339978248

商家訂單號

trade_status

String

必填

32

TRADE_CLOSED

交易狀態:WAIT_BUYER_PAY(交易建立,等待買家付款)、TRADE_CLOSED(未付款交易超時關閉,或支付完成後全額退款)、TRADE_SUCCESS(交易支付成功)、TRADE_FINISHED(交易結束,不可退款)

total_amount

Price

必填

11

88.88

交易的訂單金額,單位爲元,兩位小數。該參數的值爲支付時傳入的total_amount

receipt_amount

Price

必填

11

15.25

實收金額,單位爲元,兩位小數。該金額爲本筆交易,商戶帳戶可以實際收到的金額

...更多參數,請移步支付寶開發者文檔中心:

https://doc.open.alipay.com/doc2/apiDetail.htm?spm=a219a.7629065.0.0.1hBqdQ&apiId=757&docType=4

 

3. 請求示例

 1 <?php
 2 $params = array(
 3     //公共參數
 4 
 5     'app_id' => '2016080200150898',
 6 
 7     'method' => 'alipay.trade.query',
 8 
 9     'format' => 'JSON',
10 
11     'charset' => 'utf-8',
12 
13     'sign_type' => 'RSA2',
14 
15     'timestamp' => '2017-03-31 17:40:53',
16 
17     'version' => '1.0',
18 
19     'biz_content' => '{"out_trade_no":"20170331125451"}',
20 
21     'sign' => 'CqVzz7bZ2PCnAGczJcciEqMsbtBe2eEArNoiOjD2iY7DwGsGrXicYLk6lnlc6Pq5uJaOwHRGbae8Y6R7bvGpX9lPEH/zlTkT56fTtfQ1EQbk5UYcW/Z8q5mhje3c/DNIQ4tOiRX5K9RSctbvC/8kQMx4MUDMc9xiJZfzl9WRfAH45Bn3PGme91QoX1lcw8Ztyz+rKF7UCAIjerIVXrAcrHWL9e7B7UEM1BJJ8WEwMQ1nIsW7tiTuKWfbZ/vOHeyUsFUqWShQoXV38v3qADAotYDtQt6v0y4Uell+A4NlXuDT7++jmGsa+NTPaTM4mhXfFt3Sa1rkmO9fky/6sR+CkQ==',
22 
23 
24     //請求參數
25 
26     'out_trade_no' => '20170331125451'
27 );

剩下操做步驟,參考【5、統一收單線下交易建立 -> 3.請求示例】,此處再也不贅述。

4. 返回示例

請求接口後,返回的數據格式爲JSON格式的字符串。

接口調用成功:

 

接口調用失敗:

 

相關文章
相關標籤/搜索