個(gè)人店鋪線下支付二維碼孝治,一般會(huì)放2個(gè)(1個(gè)微信收款碼,一個(gè)支付寶收款碼)
網(wǎng)上也提供很多多個(gè)二維碼融合的技術(shù),這里僅提供思路尘盼,以及GoLang實(shí)現(xiàn)的樣例代碼憨愉。
具體效果可看:
個(gè)人電鋪?zhàn)?cè) http://pay.xiaoa7.top:8090/register 需要提交個(gè)人的微信、支付寶收款碼
個(gè)人融合二維碼 http://pay.xiaoa7.top:8090/qr/注冊(cè)時(shí)你填寫(xiě)商鋪代碼卿捎,可以將生成的二維碼配紫,打印在任何地方。
目前只支持微信娇澎,支付寶笨蚁;后續(xù)可擴(kuò)展支持其他。
融合二維碼支付流程:
1.商戶在支付寶趟庄、微信中生成個(gè)人收款碼括细,存儲(chǔ)到手機(jī)。
2.瀏覽器訪問(wèn)(微信里直接掃碼打開(kāi)這個(gè)地址也可以)http://pay.xiaoa7.top:8090/register 戚啥,提交收款碼圖片
3.服務(wù)端Go 調(diào)用zbar 識(shí)別圖片中二維碼內(nèi)容奋单。微信是wxfp開(kāi)頭,支付寶是https://xxx的猫十,實(shí)際就是收款二維碼的內(nèi)容览濒。服務(wù)端數(shù)據(jù)庫(kù)記錄商戶ID,微信收款碼wxfp拖云,支付寶收款碼https://xx
4.為商戶生成一個(gè)內(nèi)容為url的二維碼贷笛,格式如下:http://pay.xiaoa7.top:8090/pay/商戶id。這個(gè)二維碼商戶可以下載宙项,打印乏苦。
5.消費(fèi)者用手機(jī)(支付寶、微信)掃碼時(shí)尤筐,實(shí)際上會(huì)訪問(wèn)http://pay.xiaoa7.top:8090/pay/商戶id汇荐,這個(gè)Action
6.依據(jù)useragent識(shí)別來(lái)源:微信、支付寶盆繁、qq掀淘、京東等支付
7.支付寶之類的,可以直接http 301跳轉(zhuǎn)油昂,就可以到給商戶個(gè)人付款界面革娄。微信需要服務(wù)端以商戶收款碼內(nèi)容(wxfpXXX)生成二維碼圖片,(這個(gè)過(guò)程可以在注冊(cè)時(shí)直接生成冕碟,以備后續(xù)使用稠腊,不用每次都生成,而且可以美化鸣哀,加上商戶信息架忌,提示消費(fèi)者長(zhǎng)按付款),生成支付二維碼圖片我衬,消費(fèi)者長(zhǎng)按圖片叹放,選擇識(shí)別圖片二維碼饰恕,實(shí)現(xiàn)支付到商戶個(gè)人賬戶。
在這一步井仰,跳轉(zhuǎn)前可以做一些記錄埋嵌,如記錄商戶交易請(qǐng)求,每日商戶交易次數(shù)等等俱恶。
GoLang代碼
var (
ali_user_agent, _ = regexp.Compile("(?i:Alipay)")
wx_user_agent, _ = regexp.Compile("(?i:MicroMessenger)")
)
//識(shí)別二維碼內(nèi)容
func DecodeQR(src multipart.File) (string, error) {
defer src.Close()
img, _, _ := image.Decode(src)
ret, err := deqr.GetDataFromImage(img)
if err != nil {
return "", err
}
return strings.Join(ret, ","), nil
}
//注冊(cè)
func registerAct(w http.ResponseWriter, r *http.Request) {
mid := r.FormValue("mid")
var wxpay, alipay string
fi, _, _ := r.FormFile("wxpay")
wxpay, err := DecodeQR(fi)
if err != nil {
fmt.Println(err.Error())
return
}
fi, _, _ = r.FormFile("alipay")
alipay, err = DecodeQR(fi)
if err != nil {
fmt.Println(err.Error())
return
}
//生二維碼
person_qr, _ := qrcode.Encode(fmt.Sprintf(*payurltpl, mid), qrcode.Medium, 256)
wxpay_qr, _ := qrcode.Encode(wxpay, qrcode.High, 256)
bs, _ := json.Marshal(merchant{
WxPayUrl: wxpay,
AliPayUrl: alipay,
PayQR: person_qr,
WxPayQR: wxpay_qr,
})
db.Save("merchant", mid, bs)
http.Redirect(w, r, "/qr/"+mid, 301)
}
//支付碼
func pay(w http.ResponseWriter, r *http.Request) {
if len(r.RequestURI) < 5 {
return
}
mid := r.RequestURI[5:]
bs, err := db.Get("merchant", mid)
m := new(merchant)
if err != nil {
return
}
json.Unmarshal(bs, m)
if ali_user_agent.MatchString(r.UserAgent()) {
http.Redirect(w, r, m.AliPayUrl, 301)
} else if wx_user_agent.MatchString(r.UserAgent()) {
//生成圖片輸出,二維碼圖雹嗦,有待美化
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
w.Header().Set("Pragma", "no-cache")
w.Header().Set("Expires", "0")
w.Header().Set("Content-Type", "image/png")
w.Write(m.WxPayQR)
} else {
fmt.Fprintln(w, "請(qǐng)使用微信、支付寶掃描")
}
}