【Node.js】實(shí)現(xiàn)一碼多付卿泽,微信,支付寶收款碼聚合吗冤。

github地址 https://github.com/unliar/wechat-alipay-qr 又厉,有幫助的話可以star 一下謝謝。修改下配置直接能用椎瘟。測試地址hipoor.com
相關(guān)參考文檔
中文 express 簡單翻譯
nunjucks模板引擎
Nodejs文檔

現(xiàn)在覆致,二維碼支付遍地開花,小攤小販都能使用二維碼進(jìn)行收款肺蔚,大大的便利了人們的日常生活煌妈。

但是,有沒有覺得用兩個(gè)二維碼是一種極其不優(yōu)雅的體驗(yàn)宣羊。

用戶在支付之前還得判斷一下這個(gè)二維碼到底是用哪種支付工具璧诵,而且會(huì)常出現(xiàn)手抖打開了錯(cuò)誤的掃一掃界面。

因此仇冯,實(shí)現(xiàn)二維碼聚合來優(yōu)化支付體驗(yàn)十分有必要之宿。

下面我們就來用 Node 的web框架 express來實(shí)現(xiàn)一個(gè)簡單的二維碼聚合。

實(shí)現(xiàn)原理:

不同的瀏覽器會(huì)有不同的請求頭苛坚,根據(jù)請求頭的user_agent 就能對微信瀏覽器和支付寶瀏覽器進(jìn)行不同的響應(yīng)啦比被!由于微信無法直接調(diào)用支付界面,所以只能采用展示二維碼界面長按進(jìn)行支付泼舱。agent如下等缀,加粗部分為用于判斷客戶端的特征值。

微信瀏覽器user-agent: "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A372 MicroMessenger/6.5.16 NetType/4G Language/zh_CN"

支付寶user-agent: "Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; BLN-AL10 Build/HONORBLN-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.4.950 UWS/2.11.0.20 Mobile Safari/537.36 UCBS/2.11.0.20 Nebula AlipayDefined(nt:4G,ws:360|0|3.0) AliApp(AP/10.1.2.091816) AlipayClient/10.1.2.091816 Language/zh-Hans useStatusBar/true

開發(fā)步驟

前置工作:

1娇昙,安裝nodejs尺迂。
2,安裝 express-generator冒掌。
3噪裕,初始化項(xiàng)目。

npm install -g express-generator
express  qrcode
cd qrcode 
npm install qr-image --save    //生成二維碼模塊
npm install  nunjucks --save   //模板引擎模塊

定義配置

1股毫,修改 app.js ,引入nunjucks 模板引擎和配置州疾。
2,去除默認(rèn)的jade引擎皇拣。去除不需要的路由。
3,新增config/index.js,修改 www/bin 配置氧急。
4颗胡,修改路由 routes/index.js ,新增視圖 view/* 模板。

app.js 具體內(nèi)容

let express = require('express');
let path = require('path');
let logger = require('morgan');
let cookieParser = require('cookie-parser');
let bodyParser = require('body-parser');
let nunjucks = require('nunjucks');
let index = require('./routes/index');


let app = express();

app.enable('trust proxy')
// view engine setup
nunjucks.configure('views', {
  autoescape: false,
  express: app,
  noCache: false
});
app.set('view engine', 'html');
app.set('views', path.join(__dirname, 'views'));

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('combined'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: false
}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);


// catch 404 and forward to error handler
app.use(function (req, res, next) {
  let err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handler
app.use(function (err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

config/index.js 具體內(nèi)容

module.exports = {
  hostName: "http://hipoor.com", //可訪問地址吩坝,本地開發(fā)預(yù)覽時(shí)毒姨,填你的電腦局域網(wǎng)ip+端口。
  alipayUrl: 'HTTPS://QR.ALIPAY.COM/FKX0736735EJNZE1PEYUA6', //你的支付寶收款碼識別出來的地址-->https://cli.im/deqr/
  wechatPayQR: 'img/qr.png', //你的微信收款碼
  port: 2666 //端口號
}

主要的路由邏輯 routes/index.js

let express = require('express');
let router = express.Router();
let qr = require("qr-image")
let {
  hostName,
  alipayUrl,
  wechatPayQR
} = require("../config/index")

// 把你的可訪問地址生成一張二維碼圖片作為首頁入口
let qrImg = qr.image(hostName, {
  type: 'png'
})
qrImg.pipe(require("fs").createWriteStream("public/img/qrImg.png"))

// 首頁路由邏輯
router.get('/', function (req, res) {
//獲取瀏覽器agent
  const {
    'user-agent': agent
  } = req.headers

  if (agent.indexOf("MicroMessenger") !== -1) {
    //跳轉(zhuǎn)微信二維碼展示
    res.redirect("/wechat")
  } else if (agent.indexOf("AlipayClient") !== -1) {
    //支付寶掃描直接跳轉(zhuǎn)到轉(zhuǎn)賬
    res.redirect(alipayUrl)
  } else {
    //否則渲染入口頁
    res.render("index")
  }

});

// 微信二維碼展示地址
router.get("/wechat", (req, res) => {
  res.render('wechat', {
    url: wechatPayQR //你的微信轉(zhuǎn)賬圖片地址
  })
})
module.exports = router;

視圖層

{% extends "layout.html" %} 
{% block body %}

<h1>打錢使我快樂</h1>
<h2>長按支付</h2>
![]({{url}}) 
 {% endblock%}

結(jié)語

這個(gè)案例只做到了單用戶钉寝,事實(shí)上多用戶也可以根據(jù)這個(gè)進(jìn)行擴(kuò)展弧呐。
具體需要完善以下邏輯:
1,最好實(shí)現(xiàn)多用戶注冊登錄
2嵌纲,前端實(shí)現(xiàn)二維碼的展示俘枫。
3,后端對用戶提交的二維碼信息進(jìn)行解析逮走,存儲(chǔ)在數(shù)據(jù)庫鸠蚪。給每個(gè)用戶信息唯一的id并渲染一個(gè)聚合二維碼入口頁面。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末师溅,一起剝皮案震驚了整個(gè)濱河市茅信,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌墓臭,老刑警劉巖蘸鲸,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窿锉,居然都是意外死亡酌摇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門榆综,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妙痹,“玉大人,你說我怎么就攤上這事鼻疮∏右粒” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵判沟,是天一觀的道長耿芹。 經(jīng)常有香客問我,道長挪哄,這世上最難降的妖魔是什么吧秕? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮迹炼,結(jié)果婚禮上砸彬,老公的妹妹穿的比我還像新娘颠毙。我一直安慰自己,他們只是感情好砂碉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布蛀蜜。 她就那樣靜靜地躺著,像睡著了一般增蹭。 火紅的嫁衣襯著肌膚如雪滴某。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天滋迈,我揣著相機(jī)與錄音霎奢,去河邊找鬼。 笑死饼灿,一個(gè)胖子當(dāng)著我的面吹牛幕侠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赔退,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼橙依,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了硕旗?” 一聲冷哼從身側(cè)響起窗骑,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漆枚,沒想到半個(gè)月后创译,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墙基,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年软族,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片残制。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡立砸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出初茶,到底是詐尸還是另有隱情颗祝,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布恼布,位于F島的核電站涩哟,受9級特大地震影響帽馋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泣洞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一威鹿、第九天 我趴在偏房一處隱蔽的房頂上張望布蔗。 院中可真熱鬧腐魂,春花似錦、人聲如沸翩腐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栗菜。三九已至,卻和暖如春蹄梢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背富俄。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工禁炒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人霍比。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓幕袱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悠瞬。 傳聞我的和親對象是個(gè)殘疾皇子们豌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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