只有企業資質才能申請微信支付接口,作為一名程序員要想實現自動收款除了想辦法搞到企業資質申請官方的微信支付接口外還可以想辦法通過個人收款碼來實現。
個人二維碼收款碼里面除了可以設計金額外還可以設置收款方的備注,這個收款方的備注在識別是哪個用戶付款的時候會用到,需要與付款方的備注區分。
同一個金額按照不同的收款備注設置多個,然后保存到服務端,那么數據庫有張表就保存了 收款備注,收款金額,收款二維碼圖片地址 ,收款狀態這四個字段。姑且稱之為收款碼表。
如果有一個用戶要付款,就從收款碼表中找到一個金額匹配且收款狀態為可收款狀態的二維碼,這個二維碼給到用戶的同時需要把對應收款狀態設置為支付中狀態。
在前台用戶支付成功后,我們通過微信收款輔助工具(這個工具后面詳細講解),就可以獲取到收款方備注,金額等信息。講是收款方備注傳給服務器,通過收款方備注服務器可以知道是哪個用戶支付的。
為了避免一個用戶長時間占這某個二維碼不支付,我們需要在前后台都控制每隔5分鍾設置收款狀態為可支付狀態。
這種實現辦法適合小額,支付頻率不高的場景。比如說我針對 1元這個金額生成了100個有不同收款備注信息的二維碼,那么也就是說5分鍾內最多只能有100個人同時支付,1分鍾內20個同時支付。對於一些小網站可以滿足需求。
接下來說一下微信收款輔助工具,這個工具主要的功能是,當接收到通知欄里面有微信收款通知的時候打開通知信息,獲取收款信息,然后把收款信息發送給服務器去處理。
也就是說需要有一台手機24小時聯網開着,實時的監聽手機通知欄的信息。
附:
支付寶App的通知截取
這個問題其實網上已經有很多的解決方案了,其利用的是Android中的NotificationListenerService這個類,通過注冊這個Listener,可以在推送通知彈出來的時候,獲取到其發送的App、標題、內容等信息。我們最關心的就是App和推送內容。
判斷發送App的包為支付寶的包,然后再從推送的內容中獲取到具體的內容,即可得到付款金額。
示例代碼如下:
public class AlipayNotificationListenerService extends NotificationListenerService { public AlipayNotificationListenerService() { } @Override public void onNotificationPosted(StatusBarNotification sbn) { // 這里可以拿到包名,可以按照需要判斷。 String packageName = sbn.getPackageName(); Notification notification = sbn.getNotification(); if (notification == null) { return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Log.e("SevenNLS","in 1"); Bundle extras = notification.extras; if (extras != null) { // 這里是具體的title和content,可以從中提取金額 String title = extras.getString(Notification.EXTRA_TITLE, ""); String content = extras.getString(Notification.EXTRA_TEXT, ""); Log.d("Zachary", "title:" + title + " content:" + content); } } } @Override public void onListenerConnected() { Log.e("Zachary","connected"); } }
當然,為了讓這個App能夠順利進行,還要給它獲取通知的權限,保證它不被清理等等,需要做一些相應的保護措施。