溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

vue 項(xiàng)目中如何實(shí)現(xiàn)授權(quán)獲取微信中的openId

發(fā)布時(shí)間:2020-11-16 14:38:47 來(lái)源:億速云 閱讀:694 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)vue 項(xiàng)目中如何實(shí)現(xiàn)授權(quán)獲取微信中的openId,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

1、獲取url中參數(shù)code; 根據(jù)code 獲取openId;調(diào)用后臺(tái)接口獲取openId 。

function getUrlKey(name){//獲取url 參數(shù)
 return decodeURIComponent((new RegExp('[?|&]'+name+'='+'([^&;]+?)(&|#|;|$)').exec(location.href)||[,""])[1].replace(/\+/g,'%20'))||null;
 }
 
function getCodeApi(state){//獲取code 
 let urlNow=encodeURIComponent(window.location.href);
 let scope='snsapi_base'; //snsapi_userinfo //靜默授權(quán) 用戶無(wú)感知
 let appid='wx4cc5d5c123123123';
 let url=`https://open.weixin.qq.com/connect/oauth3/authorize?appid=${appid}&redirect_uri=${urlNow}&response_type=code&scope=${scope}&state=${state}#wechat_redirect`;
 window.location.replace(url);
}

//注意代碼放置位置
export default {
 created(){
 let code=getUrlKey("code");//獲取url參數(shù)code
 if(code){ //拿到code, code傳遞給后臺(tái)接口換取opend
 getOpenIdApi(code).then(res=>{
   console.log(res);
  }).catch(res=>{})
 }else{
 getCodeApi("123");
 }
 }
}

補(bǔ)充知識(shí):vue 微信公眾號(hào)支付 jssdk jsapi實(shí)現(xiàn)微信支付(完整版)

是自己項(xiàng)目里支付功能測(cè)試成功后的代碼參考,希望能幫助到曾和我一樣想找到有效參考借鑒的朋友們,

廢話不多說(shuō),直接講具體的操作規(guī)程及完整代碼

代碼部份:

一、vue的環(huán)境配置:

1. 先在當(dāng)前項(xiàng)目的命令行工具里安裝npm install weixin-jsapi

2. 在當(dāng)前支付頁(yè)面引用該weixin-jsapi

import wx from 'weixin-jsapi'

二、調(diào)用后臺(tái)接口,正式使用jssdk:

created(){
 this.userId = JSON.parse(Cookie.get("user")).id;//這是在我頁(yè)面需要獲取的userid,不需要的可自行刪悼,不在支付代碼范圍
 this.getConfig();,
},
methods: {
 getConfig(){
 console.log(window.location.href);
 var url = window.location.href;
 this.$http.post('**此處寫(xiě)后臺(tái)提供獲取jsapi相關(guān)配置的接口**',{
  encodeUrl:Encrypt(url.split("#")[0]) //直接丟棄#及后面的字符串 注意這里Encrypt因?yàn)槲业捻?xiàng)目里使用了ase加密解密,所以這么寫(xiě)的
 })
 .then(function(response) {
  if(response.data.flag == true){
  var data = JSON.parse(Decrypt(response.data.data));//將解密后的字符串轉(zhuǎn)為對(duì)象 Decrypt這里是解密,不需要的就直接過(guò)濾悼
  console.log(data);
  //下列的data.均為后臺(tái)接口返回的字段,比如我的項(xiàng)里里返回的是 appid,timestamp,nonceStr,signature
  wx.config({
   debug: ture,//這里一般在測(cè)試階段先用ture,等打包給后臺(tái)的時(shí)候就改回false,
   appId: data.appid,
   timestamp: data.timestamp, 
   nonceStr: data.noncestr, 
   signature: data.signature,
   jsApiList: ['chooseWXPay']
  })
  wx.ready(function(){
   wx.checkJsApi({
   jsApiList: ['chooseWXPay'],
   success:function(res){
    console.log("seccess")
    console.log(res)
   },
   fail:function(res){
    console.log("fail");
    console.log(res)
   }
   })
  })
  }else{
  Toast({
   message: response.data.detailMsg
  });
  }
 }).catch(function(error){
  Toast({//提示引用的是mint-UI里toast
  message: '獲取config失敗,請(qǐng)重試'
  });
 });
 },
 //報(bào)名繳費(fèi) ( 支付按鈕綁定@click="toapply()"事件)
 toapply(id){ 
 var $this = this;
 this.$http.post('**此處寫(xiě)后臺(tái)提供的獲取支付json數(shù)據(jù)接口**',{
  encodeStr:Encrypt(id)//項(xiàng)目里的加密
 })
 .then(function(response) {
  if(response.data.flag == true){
  var data = JSON.parse(Decrypt(response.data.data));//將解密后的字符串轉(zhuǎn)為對(duì)象
  console.log(data);
  wx.ready(function(){
   wx.chooseWXPay({
   appId:data.appId,
   timestamp: data.timeStamp, // 支付簽名時(shí)間戳,注意微信jssdk中的所有使用timestamp字段均為小寫(xiě)。但最新版的支付后臺(tái)生成簽名使用的timeStamp字段名需大寫(xiě)其中的S字符
   nonceStr: data.nonceStr, // 支付簽名隨機(jī)串,不長(zhǎng)于 32 
   package: data.package, // 統(tǒng)一支付接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=\*\*\*)
   signType: data.signType, // 簽名方式,默認(rèn)為'SHA1',使用新版支付需傳入'MD5'
   paySign: data.paySign, // 支付簽名
   success: function (res) {
    //跳轉(zhuǎn)到支付成功頁(yè)面有這個(gè)頁(yè)面
    $this.$router.push({
    path: "/success_page",
    name:"success_page"
    })
    console.log(res);
   },
   cancel: function (res) {//提示引用的是mint-UI里toast
    Toast('已取消支付');
   },
   fail: function (res) {
    Toast('支付失敗,請(qǐng)重試');
   }
   })
  })
  }else{
  Toast({
   message: '獲取支付信息失敗,請(qǐng)重試',
  });
  }
 }).catch(function(error){
  Toast({
  message: '獲取訂單信息失敗,請(qǐng)重試',
  });
  console.log(error);
 });
 },
}

這里代碼部份完成后,就支付測(cè)試看看提示,如若彈出以下提示說(shuō)明簽名是正確的

vue 項(xiàng)目中如何實(shí)現(xiàn)授權(quán)獲取微信中的openId

二、商戶和公眾號(hào)后臺(tái)配置

1.先去商戶號(hào)后臺(tái)里配置url域名:商戶平臺(tái)–>產(chǎn)品中心–>開(kāi)發(fā)配置

vue 項(xiàng)目中如何實(shí)現(xiàn)授權(quán)獲取微信中的openId

然后到微信公眾號(hào)后臺(tái),公眾號(hào)設(shè)置/功能設(shè)置里配置url域名

ps:這里要與商戶后臺(tái)里的配置域名同步

vue 項(xiàng)目中如何實(shí)現(xiàn)授權(quán)獲取微信中的openId

代碼和配置都完成后,測(cè)試結(jié)果如下:

vue 項(xiàng)目中如何實(shí)現(xiàn)授權(quán)獲取微信中的openId

最后,講講我在支付過(guò)程中遇到的問(wèn)題:

因?yàn)槲⑿胖Ц侗娝苤臏y(cè)試麻煩,我是直接完成代碼后打包給后臺(tái)發(fā)布正式環(huán)境測(cè)試的,測(cè)試過(guò)程中一直出現(xiàn)以下的彈窗提示信息:

vue 項(xiàng)目中如何實(shí)現(xiàn)授權(quán)獲取微信中的openId

排除法,代碼里的簽名沒(méi)有bug的情況下,還一直出現(xiàn)這個(gè)提示,那就只有一個(gè)問(wèn)題,url路徑配置,網(wǎng)上查了很多說(shuō)url路徑中不能帶# ,說(shuō)是需要把把路由的hash模式改為hostry模式,如下:

vue 項(xiàng)目中如何實(shí)現(xiàn)授權(quán)獲取微信中的openId

還說(shuō)讓后臺(tái)也需要做去悼#相應(yīng)的改動(dòng),按這個(gè)方法打包給后臺(tái)測(cè)試 ,結(jié)果頁(yè)面就出現(xiàn)404了,行不通,所以我是利用處理如下:

url.split("#")[0]直接丟棄#及后面的字符串

后臺(tái)沒(méi)有作#處理,后面就發(fā)現(xiàn)我們是商戶后臺(tái)沒(méi)有配置url域名這個(gè)問(wèn)題,是這里面的域名配置不能帶有#, 配置好后臺(tái)之后,測(cè)試就成功了,還別說(shuō),測(cè)試成功的那一刻,倍兒有成功感了

關(guān)于vue 項(xiàng)目中如何實(shí)現(xiàn)授權(quán)獲取微信中的openId就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI