微信小程式開發(fā)教學(xué)梳理微信支付的流程
因?yàn)闃I(yè)務(wù)需要,開發(fā)微信支付功能,涉及三種支付方式:
- JSAPI 支付:微信內(nèi)網(wǎng)頁支付,需要開通微信服務(wù)號碼
- 小程式支付:在小程式中支付,需要開通小程式
- H5 支付:在手機(jī)瀏覽器(出微信內(nèi)網(wǎng)爺)中網(wǎng)頁支付
使用微信支付的前提必開通微信商家號,要使用到那種的支付方式要前需在商家平臺(tái)開通(要審核)。
支付的錢最終都會(huì)到商戶號碼裡(一般由公司財(cái)務(wù)開通)。
開發(fā)微信支付的過程中大大小小坑還是踩了不少,終於做完了,整理下開發(fā)流程。
參考:
- 微信支付-存取指引
- 微信支付-開發(fā)文件
小程式支付
開發(fā)流程
- 小程式端請求建立訂單接口,後端統(tǒng)一下單取得
orderId
並返回 - 小程式端取得透過wx.login ()取得
code
- 小程式端拿這
code
和orderId
請求後端接口,取得支付所需資料 - 取得支付所需資料之後,小程式端呼叫wx.requestPayment()接口,直接呼叫起支付頁面
- 判斷是否支付成功後的邏輯
async?function?wxPay(goodId)?{ ??//?1.?創(chuàng)建訂單?獲取orderId ??let?orderId?=?await?ajax("POST",?"/api/OrderProgram/CreateTheOrder",?{ ????goodId,?//?商品id ??}); ??//?2.?獲得?code ??let?code?=?await?wxlogin();?//?基于pr封裝的wx.login()方法 ??//?3.?獲取支付的數(shù)據(jù) ??let?payData?=?await?ajax("POST",?"/api/OrderProgram/WxXcxPay",?{ ????orderId, ????code, ??}); ??//?4.?發(fā)起支付 ??let?res?=?await?payment(payData);?//?基于pr封裝的wx.requestPayment()方法 ??//?5.?判斷是否支付成功 ??let?payResult?=?res.errMsg; ??if?(payResult?==?"requestPayment:ok")?{ ????console.log("支付成功"); ??}?else?if?(payResult?==?"requestPayment:fail?cancel")?{ ????console.log("用戶取消支付"); ??}?else?{ ????console.log("支付失敗"); ??} }
注意事項(xiàng)
- 申請微信小程式帳號
申請成功可拿到AppID(小程式id)和AppSecret(小程式金鑰)
申請類型為企業(yè)性質(zhì),否則無法接入微信支付 - 微信小程式認(rèn)證
通過認(rèn)證的小程式才能接入微信支付和綁定商家平臺(tái) - 申請商家平臺(tái)帳號
需要第一步驟申請的AppID
申請成功可拿到MchID(商家id)和MchKey(商家金鑰) - 信小程式關(guān)聯(lián)商家號碼
微信與商家都認(rèn)證成功後,在微信後臺(tái)微信支付選單中進(jìn)行關(guān)聯(lián) - 存取微信支付
在微信後臺(tái)微信支付選單中進(jìn)行存取
H5 支付
開發(fā)流程
- 前端端請求創(chuàng)建訂單接口,後端統(tǒng)一下單獲取
orderId
# 並返回 - #前端帶著
orderId
請求支付接口,獲得mweb_url
, - 然後跳轉(zhuǎn)
mweb_url
會(huì)跳轉(zhuǎn)微信自動(dòng)調(diào)用微信支付 - 支付後返回支付頁,判斷是否支付成功(需發(fā)送請求後端查詢)
4.1 重新整理頁面,取得最新的付款(訂單)狀態(tài)。
4.2 設(shè)定一個(gè)的按鈕"我已付款",讓使用者點(diǎn)擊自動(dòng)查詢狀態(tài)。
偽代碼
async?function?wxH5Pay(goodId)?{ ??//?1.?創(chuàng)建訂單?獲取orderId ??let?orderId?=?await?ajax("POST",?"/api/OrderProgram/CreateTheOrder",?{ ????goodId,?//?商品id ??}); ??//?2.?獲取支付跳轉(zhuǎn)的URL ??let?mweb_url?=?await?ajax("POST",?"/api/OrderProgram/WxH5Pay",?{?orderId?}); ??//?3.?跳轉(zhuǎn)URL去微信支付 ??if?(mweb_url)?{ ????location.href?=?mweb_url; ??}?else?{ ????console.log("回調(diào)地址出錯(cuò)"); ??} ??//?4.?支付后返回支付頁,判斷是否支付成功 ??//?4.1?刷新頁面,獲取最新的訂單(商品)狀態(tài)。 ??//?4.2?設(shè)置一個(gè)"我已支付"的按鈕,讓用戶點(diǎn)擊之后查詢狀態(tài)。 }
注意事項(xiàng)
- 在商家平臺(tái)設(shè)定正確的支付網(wǎng)域
- 偵錯(cuò)需要在線上,如果嫌麻煩可以使用內(nèi)網(wǎng)穿透(Ngrok 或花生殼)
- 需對
redirect_url
進(jìn)行urlencode
處理 - H5 付款不能直接在微信客戶端內(nèi)調(diào)起,請?jiān)谕獠繛g覽器調(diào)起。
參考
- 微信支付-H5 支付-開發(fā)步驟
JSAPI 支付(微信內(nèi)網(wǎng)頁支付)
#開發(fā)流程
- 商品頁
- 前端商品頁建立訂單,在後端統(tǒng)一下單後取得
orderId
- 前端帶著
orderId
跳到支付頁,
- 支付頁
- #取得
code
- 第一次進(jìn)入頁面,判斷是否路徑中有
- code
- code
,請求資料跳轉(zhuǎn)授權(quán)頁面,
code會(huì)透過回呼位址一起回傳回來
拿到 - code
,傳送給後端,後端解析到
openid,保存好。
- code
- 點(diǎn)擊確定支付按鈕,觸發(fā)
wxPay()
方法
- 發(fā)送
- orderId
給後端,取得
wxData - wxData
中包含
wx.config和
wx.chooseWXPay兩個(gè)介面的資料。
先呼叫 - wx.config()
然後在呼叫
wx.chooseWXPay(),如果一切正常,付款頁面就會(huì)彈出。
支付狀態(tài)透過後端去查詢 - orderId
- 商品頁
//?1.?創(chuàng)建訂單?獲取orderId let?orderId?=?await?ajax("POST",?"/api/OrderProgram/CreateTheOrder",?{ ??goodId,?//?商品id }); //?2.?攜帶id?跳轉(zhuǎn)到支付頁 this.$router.push({?name:?"wx_pay_page",?params:?{?orderId:?id?}?});
- 入口檔案(
- main.js
)
//?main.js?引入?js-sdk import?wx?from?"weixin-js-sdk";
- #付款頁HTML##
<template> ??<p> ????<button @click="wxPay">點(diǎn)擊支付</button> ??</p> </template>
獲取 code 請求這個(gè)地址之后, 前端引入 js-skd 整個(gè)流程走下來,給我的體驗(yàn)是:小程序支付最方面(因?yàn)榕渲蒙伲?,其次?H5,JSAPI 支付最麻煩(文章一多半都在寫它) 在微信支付功能開發(fā)過程中,其實(shí)最麻煩的不是開發(fā)流程,而是他的各種配置和授權(quán)流程,為了拿到所需的參數(shù)而來回折騰。 開發(fā)過程中的一些參數(shù)是經(jīng)常用到的,如 appid、openid、orderId 支付流程大徑相同,先獲取到用戶的 openid,知道你是誰,然后統(tǒng)一下單拿到 orderId 再去處理不同平臺(tái)的支付方式 開發(fā)時(shí)候用到的相關(guān)文檔,一定要仔細(xì)閱讀二遍以上為止?。?/p>
遇到問題不要死剛,多百度多 Google,說不準(zhǔn)你遇到的問題已經(jīng)有無數(shù)的人遇到過并且已經(jīng)有成熟的解決方案了。 前端和后端要多溝通,有什么問題(難點(diǎn))隨時(shí)反饋,需要什么參數(shù)好好說,遇到觀點(diǎn)不一致的時(shí)候千萬要注意控制住情緒,切莫撕逼(.——.)。 因?yàn)楸救怂接邢蓿瑢蠖肆鞒潭貌欢?,只能以前端的角度來梳理整個(gè)支付流程。 以上,希望對你有所幫助。//?Vue
data(){
????return?{
????????orderId:?this.$route.params.orderId,?//?訂單id
????????url:?'',//?獲取code的url
????????wxData:?null,//?js-sdk接口所需的數(shù)據(jù)
????}
},
mounted(){
????//?判斷是否有code
????this.getCode()
}
methods:?{
????getCode()?{
????????var?code?=?this.getUrlPram("code");
????????if?(code?!=?null)?{
????????????this.code?=?code;
????????????//?拿到?code?發(fā)給?后端
????????????this.sendCode(code);
????????}?else?{
????????????//?去拿code
????????????this.getUrl();
????????}
????},
????getUrl()?{
????????//?請求后端拿到url所需數(shù)據(jù),然后跳轉(zhuǎn)頁面在通過回調(diào)地址返回,獲取code.
????????this.axios
????????????.post("/api/OrderProgram/GetOpenidAndAccessToken",?{
????????????????orderId:?this.orderId,
????????????})
????????????.then((data)?=>?{
????????????????this.url?=?`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${data.appId}&redirect_uri=${data.redirect_uri}&response_type=${data.response_type}&scope=${data.scope}&state=${data.state}`;
????????????????window.location.href?=?this.url;
????????????})
????????????.catch((err)?=>?{
????????????????console.log(err);
????????????});
????},
????sendCode(code)?{
????????//?發(fā)送code給后端?后端解析出openid
????????this.axios
????????????.post("/api/OrderProgram/GetOpenidAndAccessTokenFromCode",?{
????????????????code:?code,
????????????})
????????????.then((res)?=>?{
????????????????console.log(res);
????????????})
????????????.catch((err)?=>?{
????????????????console.log(err);
????????????});
????},
????wxPay:?async?function()?{
????????//?發(fā)送orderid,獲取wx.chooseWXPay和wx.config所需的參數(shù)
????????this.wxData?=?await?this.axios.post(
????????????"/api/OrderProgram/WxJSAPIPay",
????????????{?orderId:?this.orderId?}
????????);
????????let?wxConfigData?=?this.wxData.wxConfigData?//?獲取wx.chooseWXPay()所需數(shù)據(jù)
????????let?wxPayData?=?this.wxData.wxPayData;//?獲取wx.config()所需數(shù)據(jù)
????????this.$wx.config({
????????????debug:?false,?//?開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過log打出,僅在pc端時(shí)才會(huì)打印。
????????????appId:?wxConfigData.appId,?//?必填,公眾號的唯一標(biāo)識
????????????timestamp:?wxConfigData.timeStamp,?//?必填,生成簽名的時(shí)間戳
????????????nonceStr:?wxConfigData.nonceStr,?//?必填,生成簽名的隨機(jī)串
????????????signature:?wxConfigData.paySign,?//?必填,簽名
????????????jsApiList:?[
????????????????"chooseWXPay",
????????????],
????????});
????????//?執(zhí)行支付
????????this.$wx.chooseWXPay({
????????????timestamp:?wxPayData.timeStamp,?//?支付簽名時(shí)間戳,注意微信jssdk中的所有使用timestamp字段均為小寫。但最新版的支付后臺(tái)生成簽名使用的timeStamp字段名需大寫其中的S字符
????????????nonceStr:?wxPayData.nonceStr,?//?支付簽名隨機(jī)串,不長于?32?位
????????????package:?wxPayData.package,?//?統(tǒng)一支付接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=\*\*\*)
????????????signType:?wxPayData.signType,?//?簽名方式,默認(rèn)為'SHA1',使用新版支付需傳入'MD5'
????????????paySign:?wxPayData.paySign,?//?支付簽名
????????????success:?(res)?=>?{
????????????????this.$toast("支付成功");
????????????},
????????????fail:?(err)?=>?{
????????????????this.$toast("支付失敗");
????????????},
????????});
????},
}
同時(shí)支持 H5 支付和 JSAPI 支付
//?在創(chuàng)建訂單之后,就判斷環(huán)境使用哪種方法支付。
if?(isWx())?{
??this.WXPay(orderId);?//?帶著orderId跳轉(zhuǎn)到支付頁邏輯
}?else?{
??this.H5Pay(orderId);?//?執(zhí)行上面H5支付中的創(chuàng)建訂單之后的邏輯
}
//?判斷是否是微信瀏覽器
function?isWx()?{
??let?uAgent?=?navigator.userAgent.toLowerCase();
??reutrn(/micromessenger/.test(uAgent))???true?:?false;
}
注意事項(xiàng)
[圖片上傳失敗...(image-b07878-1605777597831)]www.xx.com/pay
,最后獲取的 code 會(huì)拼在此回調(diào)地址后返回,返回后如www.xx.com/pay?code=xxxx
code
:https://open.weixin.qq.com/connect/oauth2/authorize
?appid=你的appid
&redirect_uri=你的回調(diào)地址(拿到code后返回)
&response_type=code(返回類型,默認(rèn)code)
&scope=snsapi_base(授權(quán)范圍,靜默授權(quán)拿到openid)
&state=STATE(自定義狀態(tài),非必填)
#wechat_redirect(重定向使用必須攜帶)
redirect_uri
參數(shù)要和你在微信公眾號里設(shè)置的回調(diào)域名一致(例如:www.xx.com/pay
),需要注意的是這 url 需要urlEncode
。code
會(huì)以你設(shè)置的redirect_uri
地址里的參數(shù)帶回來,拿到之后傳給后端就行了。
script
引入js-sdknpm
包weixin-js-sdkwx.config
的參數(shù)
wx.chooseWXPay
所需的參數(shù)
參考
總結(jié)
以上是從前端的角度來整理微信支付的流程的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

微信中使用者可以輸入付款密碼購物,那麼付款密碼忘了怎麼找回來呢?用戶需要我的-服務(wù)-錢包-支付設(shè)定-忘記支付密碼就能恢復(fù)。這篇支付密碼忘記找回方法介紹就能告訴大家具體的操作方法,以下就是詳細(xì)介紹,趕快看看吧!微信使用教程微信支付密碼忘記了怎麼找回答:我的-服務(wù)-錢包-支付設(shè)定-忘記支付密碼具體方法:1、先點(diǎn)擊我的。 2、點(diǎn)選裡面的服務(wù)。 3.點(diǎn)擊裡面的錢包。 4、找到支付設(shè)定。 5.點(diǎn)選忘記支付密碼。 6、輸入自己的資料驗(yàn)證。 7.然後輸入新的支付密碼就可以更改了。

微信支付密碼忘記了的解決辦法:1、打開微信APP,點(diǎn)擊右下角的”我“,進(jìn)入個(gè)人中心頁面;2、在個(gè)人中心頁面中,點(diǎn)擊“支付”,進(jìn)入支付頁面;3、在支付頁面中,點(diǎn)選右上角的“…”,進(jìn)入付款管理頁面;4、在付款管理頁面中,找到並點(diǎn)擊“忘記支付密碼”;5、按照頁面提示,輸入個(gè)人資訊進(jìn)行身份驗(yàn)證,驗(yàn)證成功後,可以選擇「刷臉找回」或「驗(yàn)證銀行卡資訊找回」的方式來找回密碼等等。

微信支付扣款順序設(shè)定步驟:1、開啟微信APP,點(diǎn)選「我」介面,點(diǎn)選「服務(wù)」,再點(diǎn)選「收付款」;2、點(diǎn)選收付款介面付款碼下方的「優(yōu)先使用此付款方式」; 3.選擇自己需要的優(yōu)先支付方式即可。

美團(tuán)外帶app軟體內(nèi)提供的美食小吃店舖非常多,而且所有的手機(jī)用戶都是透過帳號登入的。新增個(gè)人的收貨地址以及聯(lián)絡(luò)電話,享受最方便的外帶服務(wù)。打開軟體首頁,即可輸入商品關(guān)鍵字,線上搜尋就能找到相對應(yīng)的商品結(jié)果,上下滑動(dòng)選購下單即可,平臺(tái)也會(huì)根據(jù)用戶提供的配送地址,推薦週邊附近數(shù)十家好評超高的店鋪,還能設(shè)定不同的支付方式,一鍵下單完成訂單即可,騎手第一時(shí)間安排配送速度非???,還有不同金額的外賣紅包領(lǐng)取使用,現(xiàn)在小編在線詳細(xì)為美團(tuán)外賣用戶們帶來設(shè)定微信付款的方法?! ?選擇好商品後,提交訂單,點(diǎn)選立

大家沒事的時(shí)候,都是會(huì)選擇逛逛閒魚這一平臺(tái)的,大家都能夠發(fā)現(xiàn)這一平臺(tái)上,是有著大量的一些商品的存在,都能夠讓大家看到各種各樣的一些二手的寶貝,雖然是二手的產(chǎn)品,但是這一些產(chǎn)品的質(zhì)量,絕對都是沒有任何的問題,所以大家都能夠放心的選購,價(jià)格都是特別的實(shí)惠,都還是能讓大家面對面的與這一些賣家們進(jìn)行交流溝通,進(jìn)行一些講價(jià)的操作,完全都是可以的,只要大家談的妥當(dāng)?shù)脑?,那麼你們就能夠選擇進(jìn)行交易,且大家在這裡付款的時(shí)候,想要進(jìn)行微信付款,但是好像平臺(tái)上是不允許,具體情況如何,跟著小編一起來看看吧。閒魚

微信支付成功後不能馬上取消。退款通常需要滿足以下條件:1、商家的退款政策,商家會(huì)制定自己的退款政策,包括退款的時(shí)間窗口、退款金額和退款方式等;2、支付時(shí)間,退款通常需要在一定的時(shí)間範(fàn)圍內(nèi)進(jìn)行申請,超過該時(shí)間範(fàn)圍可能無法退款;3、商品或服務(wù)狀態(tài),如果用戶已經(jīng)收到了商品或享受了服務(wù),商家可能會(huì)要求用戶將商品退回或提供相應(yīng)的證明; 4、退款流程等等。

滴滴出行app為大家日常出行提供更多方便,想去哪裡就去那裡,而且所有的滴滴車輛都是隨叫隨到的,再也不需要焦急等待了,數(shù)十個(gè)打車紅包免費(fèi)領(lǐng),出行速度更快。打開軟體首頁,依照個(gè)人的行程安排,輸入出發(fā)點(diǎn)以及目的地,正下方不同價(jià)位的車輛自由選擇,一鍵下單發(fā)布行程出去,滴滴司機(jī)都是秒接單的,以最快的速度到達(dá)指定地點(diǎn),上車前核對手機(jī)號即可,當(dāng)然支付車費(fèi)的方式非常多,微信支付寶都可以,但大家通常都是用微信,一鍵設(shè)定支付輕鬆搞定,現(xiàn)在小編在線仔細(xì)一一為滴滴出行用戶帶來設(shè)定微信支付的方法?! ?、我們在手機(jī)

1.首先我們需要打開手機(jī)上的微信APP,然後點(diǎn)選登入微信帳號,這樣就進(jìn)入了微信的首頁。 2.在微信首頁點(diǎn)選右下角的【我】按鈕,再選擇【付款】選項(xiàng),我們點(diǎn)選進(jìn)入支付頁面。 3.進(jìn)入【付款】頁面後點(diǎn)選【錢包】選項(xiàng)進(jìn)入,在【錢包】頁面點(diǎn)選右上角的【帳單】。
