支付寶移動支付服務(wù)器異步通知 python 實現(xiàn)

支付寶移動支付成功后,支付寶會給商戶端預(yù)先設(shè)置的 notifyURL 發(fā)送異步通知死陆,商戶端收到支付狀態(tài)的異步通知后,需要給支付寶返回商戶端的處理狀態(tài)唧瘾。

簡單邏輯如下(服務(wù)器異步通知方面邏輯):

  1. 移動App通過支付寶發(fā)起支付
  2. 支付寶服務(wù)端向商戶端發(fā)送支付狀態(tài)
  3. 商戶端驗證支付寶發(fā)來的請求的簽名
  4. 商戶端驗證請求是否來源支付寶
  5. 商戶端反饋支付寶處理結(jié)果

涉及 Python 庫 rsa 和 requests

rsa: <code>pip install rsa</code>
requests: <code>pip install requests</code>

主要代碼如下(Django環(huán)境):

view.py:
# ...
import AlipayHelper as AliPay
# ...

@csrf_exempt
def paycallbackAliPay(request):
    if request.method == 'POST':
        if not len(request.POST) > 0:
            return HttpResponse(status=400)
        alipay = AliPay.AliPay()
        # ?驗證簽名 sign
        if alipay.verifySignString(request.POST):
            notify_id = request.POST['notify_id']
            parter = request.POST['seller_id']
            # 驗證是否是支付寶發(fā)來的通知
            if alipay.verifyURL(parter,notify_id):
                # 處理服務(wù)器端邏輯措译,更新數(shù)據(jù)庫等
                # ...
                # ...
                # ...
                print '-------- pay success ------------'
                # 向支付寶返回?成功接收并處理異步通知狀態(tài)
                return HttpResponse("SUCCESS")
    return HttpResponse(status=400)

AlipayHelper.py

# -*- coding: utf-8 -*-

import rsa
import base64
import requests

# 支付寶 RSA 公鑰
ALIPAY_RSA_PUBLIC_KEY_PATH = 'alipay_rsa_public_key.pem'

# 驗證是否是支付寶發(fā)來的通知鏈接地址
ALIPAY_REMOTE_ORIGIN_URL = 'https://mapi.alipay.com/gateway.do'

class AliPay():

# 驗證簽名 
# params:request.POST
def verifySignString(self,params):
    if not len(params) > 0:
        return False
    key_sorted = sorted(params.keys())
    content = ''
    sign_type = params["sign_type"]
    signOrigin = params["sign"]

    for key in key_sorted:
        if key not in ["sign","sign_type"]:
            if len(params[key]) > 0:
                content = content + key + "=" + params[key] + "&"
    content = content[:-1]
    content = content.encode("utf-8")
    # print "content -> " + content

    if sign_type.upper() == "RSA":
        try:
            with open(ALIPAY_RSA_PUBLIC_KEY_PATH) as publickfile:
                pub = publickfile.read()
            pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(pub)

            # ?支付寶返回的 sign 經(jīng)過 base64 encode,先 decode 一下
            signatureString = base64.decodestring(signOrigin)
            if rsa.verify(content, signatureString, pubkey):
                # print "----------verify sign success----------"
                return True
        except Exception,e:
            # print "----------verify sign failed----------"
            return False
    else:
        # ?支付寶當前僅支持 RSA 加密饰序,未來也許會有其他類型
        return False

    return False

# 驗證是否是支付寶發(fā)來的通知
# partner:request.POST["seller_id"]领虹,也可以 hardcode
# notify_id:request.POST["notify_id"]
def verifyURL(self, partner, notify_id):
    payload = {'service':'notify_verify','partner':partner,'notify_id':notify_id}
    urlString = ALIPAY_REMOTE_ORIGIN_URL
    r = requests.get(urlString,params=payload)
    result = r.text
    # print result
    if result.upper() == "TRUE":
        # print "----------verify ?url success----------"
        return True
    return False

注意點就是,支付寶返回的 sign 是 base64 encode 過的求豫,需要先 decode塌衰,再調(diào)用方法 <code>rsa.verify()</code>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蝠嘉,隨后出現(xiàn)的幾起案子最疆,更是在濱河造成了極大的恐慌,老刑警劉巖蚤告,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件努酸,死亡現(xiàn)場離奇詭異,居然都是意外死亡杜恰,警方通過查閱死者的電腦和手機获诈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門仍源,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舔涎,你說我怎么就攤上這事笼踩。” “怎么了亡嫌?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵嚎于,是天一觀的道長。 經(jīng)常有香客問我昼伴,道長匾旭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任圃郊,我火速辦了婚禮价涝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘持舆。我一直安慰自己色瘩,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布逸寓。 她就那樣靜靜地躺著居兆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竹伸。 梳的紋絲不亂的頭發(fā)上泥栖,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音勋篓,去河邊找鬼吧享。 笑死,一個胖子當著我的面吹牛譬嚣,可吹牛的內(nèi)容都是我干的钢颂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼拜银,長吁一口氣:“原來是場噩夢啊……” “哼殊鞭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尼桶,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤操灿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泵督,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牲尺,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谤碳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溃卡。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜒简,靈堂內(nèi)的尸體忽然破棺而出瘸羡,到底是詐尸還是另有隱情,我是刑警寧澤搓茬,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布犹赖,位于F島的核電站,受9級特大地震影響卷仑,放射性物質(zhì)發(fā)生泄漏峻村。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一锡凝、第九天 我趴在偏房一處隱蔽的房頂上張望粘昨。 院中可真熱鬧,春花似錦窜锯、人聲如沸张肾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吞瞪。三九已至,卻和暖如春驾孔,著一層夾襖步出監(jiān)牢的瞬間芍秆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工翠勉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妖啥,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓眉菱,卻偏偏與公主長得像迹栓,于是被迫代替她去往敵國和親掉分。 傳聞我的和親對象是個殘疾皇子俭缓,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容