代碼寫錯,差點虧了幾萬!
活動最重要,也是最麻煩的環(huán)節(jié)就是返現(xiàn)環(huán)節(jié),這次我們是通過一個鏈接收集大家支付寶賬號,然后進行支付寶批量轉(zhuǎn)賬。但是這個工作看起來很簡單,其實有很多東西需要留意的,因為涉及到錢,最基本的要保證冪等性。什么是冪等性呢?用戶對于同一操作發(fā)起的一次請求或者多次請求的結(jié)果是一致的,不會因為多次點擊而產(chǎn)生了副作用。比如這次返現(xiàn)活動,在收集大家支付寶信息的時候,不管用戶提交了幾次信息,最終只轉(zhuǎn)賬一次。返現(xiàn)的程序是由小北實現(xiàn)的,他在實現(xiàn)的過程中,差點就因為這個事情差點虧了點錢。
以下是小北對這次返現(xiàn)的復(fù)盤:不是組織了一場新用戶免費領(lǐng)取一年阿里云服務(wù)器的活動了,現(xiàn)在已經(jīng)超過1000人購買,750 人收到了返現(xiàn),不禁發(fā)出還得是北哥的感嘆!但是在短時間內(nèi)給近1000人返現(xiàn),并且還要保證它們都是符合返現(xiàn)條件的,就不太容易,今年 6.18 我們是寫了一個檢測工具,自己檢測后截圖給我們,我們拉群,滿100人發(fā)紅包。這樣會浪費整整周六一天的時間,最近了解到支付寶有批量轉(zhuǎn)賬能力,于是我就發(fā)了個問卷向大家收集一波阿里云ID、支付寶賬號用于返現(xiàn)。這樣直接用阿里云每天導(dǎo)給我的訂單數(shù)據(jù)做校驗,看哪些用戶購買了,有資格返現(xiàn)。本來非常簡單,所以就讓小老弟去幫我寫代碼,結(jié)果怎么著,小老弟的代碼一小時就寫完了,而且用得很爽!于是前天晚上我就回去看了下小老弟的代碼,結(jié)果一看嚇一跳,差點讓我虧幾千上萬都有可能!!簡單來說支付寶批量轉(zhuǎn)賬,需要生成一個 csv,每一行是:支付寶賬號,姓名,轉(zhuǎn)賬金額,備注 這樣的信息。小老弟的代碼是這樣寫的:
users?=?get_user_info_from_file()?//??從騰訊問卷下載的大家提交的返現(xiàn)信息?csv文件導(dǎo)入
order_map?=?get_order_map()?//?從阿里云導(dǎo)出的訂單數(shù)據(jù)生成一個?map,key是用戶的阿里云ID,value是訂單信息
for?user?in?users:
??if?user.aliyun_id?in?order_map:
?????csv_file.writeline(xxxxxxxx)??//??有購買記錄的讀者信息寫入csv文件,用于批量轉(zhuǎn)賬
然后這個產(chǎn)生的 csv 文件就可以傳到支付寶 PC 端的批量轉(zhuǎn)賬接口中進行轉(zhuǎn)賬。這代碼完全能正常工作,也能完成返現(xiàn)!但是?。?!小老弟沒有考慮到異常場景,以及應(yīng)對各種羊毛黨或者用戶的錯誤操作比如說,假如一個用戶在填問卷的時候填了多次信息,上面的代碼是不是就會導(dǎo)致多次轉(zhuǎn)賬?當(dāng)然,這樣的用戶不多,但是總有大意的讀者多點了一次提交之類,后來我就發(fā)現(xiàn)了: