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