最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端H5微信支付寶支付實現(xiàn)方法(uniapp為例)

 更新時間:2024年04月01日 11:26:14   作者:燕燕的豬  
最近上線一個項目,手機網(wǎng)站進行調起支付寶App支付,做起來還是滿順手的,在此做個記錄,這篇文章主要給大家介紹了關于前端H5微信支付寶支付實現(xiàn)方法的相關資料,需要的朋友可以參考下

以uniapp項目為例

支付寶的

首先是一個支付類型選擇頁面,在選擇支付寶支付后,跳轉到一個空白頁,用于支付寶支付的中轉頁面。

在點擊立即支付之后,直接跳轉至自行設置好的空白頁就好,并把你生成訂單所需要的數(shù)據(jù)一并帶過去。

uni.navigateTo({
  url: `/pages/alipaying/alipay?orderNum=${this.orderNum}&price=${this.orderinfo.price}`,
});

接下來就是重點操作了(其實非常簡單),在跳轉這個頁面之后直接調用后端接口,將數(shù)據(jù)傳給后端生成訂單,并且還需要兩個地址,一個是取消支付的回調地址(quitUrl),一個是支付完之后的回調地址(returnUrl),后端會根據(jù)這些信息生成一個form表單返回給你,我們只需要將這個表單渲染到這個空白頁面,并進行提交表單的操作,就會跳轉至支付寶的頁面去進行支付操作,在取消或支付完成會跳轉至之前傳給后端規(guī)定好的地址,在那里去調后端接口查詢支付結果或者重新支付等其他操作就行了。
空白頁面內(nèi)容如下:

<template>
	<!-- #ifdef H5 -->
	<div v-html="html">
	  
	</div>
	<!-- #endif -->
  </template>
  
  <script>
  import api from "../../utils/api";
  //這個utils是對一些東西做了處理,其實沒必要,utils.getStorage直接用uni.getStorage一樣的
  import utils from "../../utils";
  
  export default {
	onLoad(options) {
	  this.orderNum=options.orderNum
	  this.price=options.price
	  this.couponId = options.couponId
	},
	mounted(){
		const result = utils.getStorage("weixinCallback");
		if(result!=3){//這是弄了個變量來判斷是否已經(jīng)進入了支付,防止用戶直接左滑的返回一直在觸發(fā)支付
			this.alipay()
		}
	},
	data() {
	  return {
		orderNum:"",
		price:"",
		html:"",
		couponId:""
	  };
	},
	methods: {
		async alipay(){
			//這里是獲取支付寶返回的表單用的接口,那兩個地址我在api里面寫了默認值,所以這個地方就不傳了,接口詳細內(nèi)容就和普通調接口一樣,該傳傳,該接接
			const res = await api.alipayOrder(this.orderNum,this.price,this.couponId)
			//將表單渲染進頁面
			document.querySelector('body').innerHTML = res;
			//在渲染完立即提交表單,就會進入支付寶支付的界面
			this.$nextTick(()=>{
				utils.setStorage("weixinCallback", 3);
				window.document.forms[0].submit()
			})
		}
	},
  };
  </script>

不過這里的實現(xiàn)支持正常瀏覽器h5,但是微信內(nèi)置瀏覽器的話會提示在瀏覽器打開該鏈接,非常的繁瑣,查了一下午解決方案,就是沒有解決方案(可能也是我沒找到),索性直接微信內(nèi)置瀏覽器的話就不顯示支付寶支付,反正需求很奇怪,都打開微信了還要支付寶干啥,對吧

微信的

微信支付比支付寶支付稍微麻煩一點點,但也不難,對于前端來說調接口就完事了。

微信的話有兩種,一種外部瀏覽器,一種微信內(nèi)置瀏覽器

所以首先需要一個方法來判斷瀏覽器的類型

isWeiXin(){
		let ua = window.navigator.userAgent.toLowerCase();
		if (ua.match(/MicroMessenger/i) == 'micromessenger') {
			this.payway.forEach(item=>{
				if(item.value==1){
					item.flag = false
				}
			})
			return true;
		} else {
			return false;
		}
	},

是微信內(nèi)置就返回true,不是返回false

先說外部瀏覽器的情況,在立即支付之后去判斷一下瀏覽器是什么,返回false就走下面代碼,調接口就完了

//把生成訂單需要的數(shù)據(jù)傳給后端,然后后端會返回一個地址
const res2 = await api.weixinPayOrder(this.orderNum,this.couponId);
const name = "_self";
//因為微信支付沒有傳什么回調地址,在支付完之后還會回到這個頁面,所以防止重復觸發(fā)這里設置一個值來控制
utils.setStorage("weixinCallback", 1);
//打開后端返回的地址,就可以去微信支付了
window.open(res2.mweb_url, name);

在頁面展示的時候onShow鉤子,判斷weixinCallback這個值來執(zhí)行不同的操作,如果是1說明已經(jīng)發(fā)起過支付,那么需要一個執(zhí)行另一個方法來調用查詢支付結果的接口來跳轉頁面,下面是查詢結果的方法

getOrderDetail() {
      clearTimeout(this.timer);
      this.timer = setTimeout(() => {
        let initTime = +new Date();
        let loop = () => {
        //這里調用后端給的查詢支付結果的接口,
          api.weixinPayOrderBack(this.orderNum).then((res) => {
            if (res.status == 1) {
            //支付成功跳轉
              uni.navigateTo({
                url: `/pages/payWeixinSuccess/payWeixinSuccess?orderNum=${this.orderNum}&result=yes`,
              });
            } else {
              let now = +new Date();
              if (now - initTime < 45000) {
                loop();
              } else {
              //支付失敗跳轉
                uni.navigateTo({
                  url: `/pages/payWeixinSuccess/payWeixinSuccess?orderNum=${this.orderNum}&result=no`,
                });
              }
            }
          });
        };
        loop();
      }, 2000);
    },

這樣其實就完成了外部瀏覽器的微信支付前端部分,可能還有不足或bug,至少現(xiàn)在我沒發(fā)現(xiàn)。

接下來是微信內(nèi)置瀏覽器支付,首先需要一個(jweixin-module),下載這個依賴npm、yarn都行

在調用isWeiXin()為true時,表示是微信內(nèi)置瀏覽器

首先,調用微信官方提供的鏈接獲取用戶授權信息code

//應用的appid
const appId = "wxxxxxxxxxxxx";
//重定向的地址,重定向回當前頁面
const local = window.location.href
//打開微信官方提供的鏈接,傳入appid和回調地址,在用戶確認授權后會在回調地址后面拼接上code
window.location. + encodeURIComponent(local) + '&response_type=code&scope=snsapi_base&state=1#wechat_redirect';

在授權后回到這個頁面看看地址上有沒有code,有則進行下一步

寫一個方法取出地址里的code

getUrlParam(name) {
	var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)')
	let url = window.location.href
	let search = url.split('?')[1]
	if (search) {
		var r = search.substr(0).match(reg)
		if (r !== null)return unescape(r[2])
			return null
	    } else
	    return null
	},

判斷當前地址有沒有code,有則準備進行支付操作,沒有則去到讓用戶授權

const code = this.getUrlParam("code")
if(code==null || code == ""){
	//這里走讓用戶授權的操作
}else{
	//這里走支付的操作,下面詳寫
}

在else中,使用前面下載的依賴(jweixin-module)來走支付流程

//這里是將code傳給后端來獲取openId
const res2 = await api.sendCode(code);
//然后將后端給的openId和訂單信息繼續(xù)給后端,在后端返回支付所需的一些參數(shù)在依賴中需要配置
//這兩個接口后端可以合并成一個的吧,我不太理解為啥分成兩個,繁瑣
const res3 = await api.weixinPayOrder(this.orderNum,res2.data);
//下面就是使用這個依賴包了,具體配置什么意思網(wǎng)上復制來的,一查一大堆
jweixin.config({//初始化配置
	debug: false, // 是否開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時才會打印。
	appId: appId, // 必填,公眾號的唯一標識
	timestamp: res3.timeStamp, // 必填,生成簽名的時間戳
	nonceStr: res3.nonceStr, // 必填,生成簽名的隨機串
	signature:res3.paySign, // 必填,簽名,
	jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表
});
jweixin.ready(function() {
	jweixin.chooseWXPay({//下面這些參數(shù)都是在上面接口返回給我的
		timestamp: res3.timeStamp, // 支付簽名時間戳,注意微信jssdk中的所有使用timestamp字段均為小寫。但最新版的支付后臺生成簽名使用的timeStamp字段名需大寫其中的S字符
		nonceStr: res3.nonceStr, // 支付簽名隨機串,不長于 32 位
		package: res3.package, // 統(tǒng)一支付接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=***)
		signType: res3.signType, // 簽名方式,默認為'SHA1',使用新版支付需傳入'MD5'
		paySign: res3.paySign, // 支付簽名
		success: function(res) {
			// 支付成功后的回調函數(shù)
			uni.showToast({
				icon: 'none',
				title: '支付成功',
				duration: 4000
			});
			uni.navigateTo({
				url: `/pages/payWeixinSuccess/payWeixinSuccess?orderNum=${this.orderNum}&result=yes`,
			});
		},
		cancel: function(r) {},
		fail: function(res) {
			console.log('payfail')
		}
	});
});
jweixin.error(function(res) {
	uni.showToast({
		icon: 'none',
		title: '支付失敗了',
		duration: 4000
	});
	uni.navigateTo({
		url: `/pages/payWeixinSuccess/payWeixinSuccess?orderNum=${this.orderNum}&result=no`,
	});
});

走到這里h5的微信支付也完成了,其實大部分邏輯在后端,前端只管調接口就完事了,不明白接口什么意思可以去問問后端就行,是不是非常簡單,如果看官方文檔那樣詳細的流程圖其實很多流程在后端走了,想要更多的學習的話那就去掌握后端知識咯

總結

到此這篇關于前端H5微信支付寶支付實現(xiàn)方法的文章就介紹到這了,更多相關前端H5微信支付寶支付內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue2組件進階與插槽詳解(推薦!)

    vue2組件進階與插槽詳解(推薦!)

    插槽(slot)作用是讓父組件可以往子組件指定位置插入?html?結構,也是組件的一種通信方式,下面這篇文章主要給大家介紹了關于vue2組件進階與插槽的相關資料,需要的朋友可以參考下
    2023-02-02
  • vue動態(tài)設置img的src路徑實例

    vue動態(tài)設置img的src路徑實例

    今天小編就為大家分享一篇vue動態(tài)設置img的src路徑實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue模擬el-table演示插槽用法的示例詳解

    Vue模擬el-table演示插槽用法的示例詳解

    很多人知道插槽分為三種,但是實際到elementui當中為什么這么用,就一臉懵逼,接下來就跟大家聊一聊插槽在elementui中的應用,并且自己寫一個類似el-table的組件,感興趣的可以了解一下
    2023-05-05
  • vue中methods、mounted等的使用方法解析

    vue中methods、mounted等的使用方法解析

    這篇文章主要介紹了vue中methods、mounted等的使用方法解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Nuxt.js SSR與權限驗證的實現(xiàn)

    Nuxt.js SSR與權限驗證的實現(xiàn)

    這篇文章主要介紹了Nuxt.js SSR與權限驗證的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • Vue2.x中的Render函數(shù)詳解

    Vue2.x中的Render函數(shù)詳解

    通常開發(fā)vue我們使用的是模板語法,其實還有和react相同的語法,那就是render函數(shù),同樣支持jsx語法。Vue 的模板實際是編譯成了 render 函數(shù)。
    2017-05-05
  • Vue一個動態(tài)添加background-image的實現(xiàn)

    Vue一個動態(tài)添加background-image的實現(xiàn)

    這篇文章主要介紹了Vue一個動態(tài)添加background-image的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Vue實現(xiàn)將頁面區(qū)域導出為pdf

    Vue實現(xiàn)將頁面區(qū)域導出為pdf

    文章介紹了兩種將前端頁面指定區(qū)域導出為PDF的純前端實現(xiàn)方法,方式一使用jsPDF和html2canvas將特定區(qū)域轉化為圖片,再將圖片轉化為PDF,適用于小區(qū)域轉換,但存在翻頁時內(nèi)容拆分的問題,方式二使用html2pdf.js,支持自動分頁,適用于較大區(qū)域的轉換
    2025-10-10
  • vue和iview實現(xiàn)Scroll 數(shù)據(jù)無限滾動功能

    vue和iview實現(xiàn)Scroll 數(shù)據(jù)無限滾動功能

    今天小編就為大家分享一篇vue和iview實現(xiàn)Scroll 數(shù)據(jù)無限滾動功能,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • Vue作用域插槽實現(xiàn)方法及作用詳解

    Vue作用域插槽實現(xiàn)方法及作用詳解

    這篇文章主要介紹了Vue作用域插槽實現(xiàn)方法及作用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07

最新評論

SHOW| 于都县| 尼木县| 阿鲁科尔沁旗| 柘荣县| 兴化市| 岫岩| 凤庆县| 营山县| 句容市| 视频| 毕节市| 密山市| 麻栗坡县| 岳阳县| 汉中市| 翁源县| 米脂县| 英吉沙县| 江阴市| 宣城市| 丁青县| 左权县| 南丰县| 基隆市| 萨嘎县| 昌宁县| 达孜县| 乐业县| 宁陕县| 资溪县| 建昌县| 高陵县| 高州市| 拜泉县| 任丘市| 左权县| 石渠县| 鄢陵县| 柏乡县| 辉县市|