當前位置:
首頁 > 知識 > 個人開發者實現掃碼支付的思路

個人開發者實現掃碼支付的思路

基於項目極客教程裡面的電子書支付場景,需要實現支付功能。

第三方支付介面對比

現在互聯網支付方式有很多種,基本上分為如下幾種:


個人開發者實現掃碼支付的思路

打開今日頭條,查看更多精彩圖片


image

網銀支付

每家銀行接入的流程都不相同,以建設銀行網銀系統開戶流程為例:

想要接入的銀行,需要一家家的談,對於沒有業務量、業務模式無創新的合作商戶,支持力度低,而且費率高。當然這是可以理解的,畢竟銀行也是有自己的成本費用的,所以支付成本和技術難度都是有的。但是,如果想以個人名義接入,還是不要勉強吧。還是考慮第三方支付平台吧,首先不得不說的是兩個國內主流的第三方支付平台大佬,支付寶和微信。

支付寶

支付寶支持電腦網站支付,手機網站支付,APP支付和當面付。完全能滿足我的使用場景,但是接入網站都需要有營業執照,無論是個人還是企業。因為資質的原因,所以我沒有辦法作為企業用戶直接接入。

不過,在網上搜索到說是可以通過分潤的方法,實現無資質的接入,這一點我也研究了一下。解釋一下什麼是分潤:就是有企業資質的企業賬號,通過建立子賬號關聯,綁定一個共有企業資質的子賬號,這個子賬號和企業賬號擁有相同的功能,並且有獨立的資金管理。用戶通過網站付款,此時使用的是企業賬號調用支付寶介面,當用戶支付成功後,企業賬號收款後自動分賬到子賬號,這種方式對於有熟悉的企業賬號的朋友來說確實還挺好。但是,小編通過官方證實分潤早在2015年10月,支付寶就已經不支持了。所有的子賬號和企業賬號一樣,需要獨立簽約支付寶的收款產品,簽約也就意味著要重新上傳企業資質(支付寶並不會共享企業賬號的企業資質哦)。所以,歸根結底,使用就需要有企業資質。

微信支付

微信支持公眾號支付,APP支付,掃碼支付,刷卡支付和微信買單。使用掃碼支付,需要先註冊公眾號,然後提交企業資質認證,驗證通過後,才能接入。

想一下都不是一個簡單的工程,除了需要花300塊錢認證公眾號,還需要有企業資質。那麼其他一些不支持個人無企業資質的平台,就不深入挖掘了。找了一些不需要企業資質的第三方支付平台。

PayPal

  • 個人,企業都可以接入,作為一款主打跨境支付的產品,主打境外收付款,那麼對於做外貿的朋友來說是一個不錯的選擇。
  • 有網站,無網站,B2B商家,個人收款都適用。
  • 支持的付款方式主打銀聯、信用卡等,付款可以及時到賬。
  • 用戶註冊後,可以在網站商獲取一個PayPal賬戶,當客戶付款後,款項會打到用戶的PayPal的賬戶中,用戶可以提現的方式提取。but,提現到中國銀行賬戶,會收取1.2%的手續費(這手續費也是呵呵了……)。
  • 使用PayPal的主要費用就是手續費,按照月銷售額來計算,在月銷售額在3,000及以下時,支付費用是4.4%+0.3美元。

在API對接過程中,開發、測試、整合很方便。但是,手續費略高(支付手續費+提現手續費),且PayPal不同於支付寶,更偏向於買家,如果買家有任何不滿意而產生的爭議,賣家將拿不到錢。

商派天工

  • 支持個人和企業接入。個人接入需要實名認證,企業認證需要企業資質。
  • 主要適用於電腦網站、H5、掃碼支付其他場景。
  • 支持的付款方式主要是微信、支付寶和京東支付。
  • 付款時,支持掃碼和彈框支付,由天工生成付款二維碼,天工代收訂單款項,用戶以提現的方式提取。
  • 使用費用主要是收取1%的手續費,到賬周期T+2

在API介面接入中,提供了沙箱環境測試,然而文檔寫的比較簡陋,介面尚不完善。

paypayzhu

  • 個人,企業都可以接入 paypayzhu.com。
  • 適用於:電腦網站和手機網站。
  • 支持微信、支付寶掃碼支付。
  • 訂單款項直接打到用戶的微信、支付寶賬號中,平台不留存資金。
  • 使用費用包括29元/月的月租,和每筆訂單0.3%的手續費。
  • API介面接入很簡單,且支持API介面回調,有代碼示例作為參考。

接入paypayzhu,需要在安卓系統上安裝一個APP,然後按照網站的說明文檔配置下就可以了。因為交易資金無中轉,所以特別關注了一下。首先要用自己的支付寶和微信生成很多付款碼,然後上傳到自己的註冊賬戶。當網站調用支付介面(實際上就是把你自己的二維碼展示給了用戶),當用戶付款成功後,款項是到了自己的支付寶和微信賬戶中,此時介面會自動返回回調信息,然後就可以進行下一步操作了。

整個過程中,支付很安全,款項直接到自己的賬戶,回調信息反饋及時,是比較能打動人的。對於個人網站,沒有企業資質也還比較合適的。不過就是需要一個安卓機來24小時運行這個APP,不能掛啊,掛了就收不到回調信息了。建議家裡如果有不用的手機,安裝一個充著電放在那裡不動還是可以的。

不過我也考慮過,會不會對我的支付寶和微信賬號有什麼風險,然而不會,整個過程沒有要求我Root許可權,也不需要我輸入支付寶和微信的賬號密碼,所以不存在盜取賬號和秘鑰的可能,這點我還是比較放心的。

雲付通Passpay

  • 支持個人和企業接入。個人接入需要實名認證,企業認證需要企業資質。
  • 適用於:網頁支付,手機支付,線下掃碼支付。
  • 支持銀聯、支付寶、京東錢包、Apple pay、微信、qq錢包、visa、PayPal等。
  • 訂單收款存入銀行或者微信、支付寶平台上,平台不留存資金。
  • 使用費用主要是手續費:網銀1.5%,支付寶2.5%,微信2%。滿100元才可提現。

API接入,各種語言和系統的集成包比較全面,簡化了接入流程。支持的付款方式豐富,但是手續費頗高,提現有門檻。

Ping++

第四方聚合支付,所謂聚合支付 ,實際上是簡化了平台接入的流程,適合對多個系統對接的需求,但是客戶支付的渠道,還需要用戶自己去申請,所以企業資質是免不了的。

三方對比總結

對於個人開發者,網銀,支付寶,微信都是不可行的,這裡就可以考慮第四方聚合支付,但是採取這種的話,是需要各種手續費的,對於支付不常用或者數額不大的話,不划算,於是我這裡採用了另一種方式實現了支付寶和微信的掃碼支付

自己實現

因為我採用的nodejs 框架express 資料庫用的是mongod,所以以下代碼都是基於nodejs和mongod的。

整體思路

依據電子書價格,在支付寶和微信設置收款金額二維碼,然後保存在自己伺服器,用戶點擊購買,向用戶展示收款二維碼,用戶掃碼支付後,需要用戶輸入支付昵稱或者支付單號後4位,然後創建支付訂單,製作一個移動端確認支付訂單頁面,然後根據支付昵稱或者支付訂單號確認那個用戶支付,然後利用websocket通知用戶購買頁面,確認購買成功。完美。(唯一不足的就是,需要開發者手機時刻在旁邊,因為用戶付款後,支付寶或者微信會有實時通知,有通知來,再用手機打開支付確認頁面確認購買)。

可以在如何寫電子書體驗完整流程。

創建支付訂單

實現支付,需要創建支付訂單。基於此,創建一個訂單schemas,如下:

const OrderSchema=new Schema({
user:{
type:ObjectId,
ref:"User"
},
ebook:{
type:ObjectId,
ref:"Ebook"
},
// 價格
price: {
type:Number,
default:0
},
code: String,
nickname: String,
// 是否購買成功
success: {
type:Boolean,
default: false
},
meta:{
createAt:{
type:Date,
default:Date.now()
},
updateAt:{
type:Date,
default:Date.now()
}
}
})

用戶點擊購買後,展示付款頁面,

,然後用戶付款成功,用戶填入確認信息


個人開發者實現掃碼支付的思路


image.png

確認付款成功創建支付訂單,然後製作移動端確認訂單頁面


個人開發者實現掃碼支付的思路


paydemo01.png

勾選確認用戶購買,然後利用websocket實時通知用戶購買成功!

部分後端代碼:

module.exports = (order,notification) => {
order.on("connection", function (socket) {
socket.on("buy", (data) => {
const orders = data.orders;
let users = [];
orders.map((val) => {
let ebookId = val.ebook._id;
let ebookTitle = val.ebook.title;
let ebookPrice = val.ebook.price;
let userId = val.user._id;
let userName = val.user.name;
Order.update({_id: val._id},{$set:{success: true}},(err) => {
if(err) console.log(err);
Ebook.update({_id: ebookId},{$addToSet: {purchasers: userId}},(err) => {
if(err) console.log(err);
let fromSystem = {
info: `用戶${userName}購買了您的電子書<<${ebookTitle}>>`,
createAt: Date.now()
}
// 購買成功,給用戶增加積分
GeekjcEgg.findOne({user: val.ebook.author},(err,geekjcEgg) => {
if(err) console.log(err);
let number = ebookPrice * 100;
let detail = {
number: number,
currentTotal: geekjcEgg.number + number,
actionType: "buyEbook",
description: `用戶購買《${ebookTitle}》獲取${number}積分`,
createAt: Date.now()
}
GeekjcEgg.update({user: val.ebook.author},{$inc: {number: number},$addToSet: {details: detail}},(err)=>{
if(err) console.log(err)
});
});
Notification.findOneAndUpdate({user: val.ebook.author},{$inc: {unreads: 1,systemUnreads: 1},$addToSet:{fromSystem: fromSystem}},{new: true}, (err,doc) => {
if(err) console.log(err);
notification.emit("message", {
userId: val.ebook.author,
unreads: doc.unreads || 0
});
});
});
});
});
orders.map((val) => {
let userId = val.user._id;
users.push(userId);
});
order.emit("buy",{
users: users
});
});
});
}

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 極客教程 的精彩文章:

React 前後端同構防止重複渲染
mpvue系列(四):建議與注意事項

TAG:極客教程 |