前端微信支付与支付宝支付

忘是亡心i 2022-12-27 04:40 405阅读 0赞

文章目录

  • 一、微信支付
  • 二、支付宝支付

一、微信支付

在移动端微信支付分为微信内支付和微信外支付。

  1. 在订单组件中选择支付方式之后在支付页面先去判断是否在微信内:

    //判断是否微信

    1. is_weixn(){
    2. var ua = window.navigator.userAgent.toLowerCase();
    3. if (ua.match(/MicroMessenger/i) == 'micromessenger'){
    4. return true;
    5. } else {
    6. return false;
    7. }
    8. },
  2. 触发立即支付方法,根据微信内外的不同请求后端不同的接口

  3. 微信外支付的话,后端返回一个url,前端进行跳转,在调起支付的页面监听从其他页面返回的事件,进行一些刷新业务逻辑。

    handelPay() {

    1. if
    2. (this.wechatpayType == 'wxpay'){
    3. // console.log("微信内支付")
    4. let data={
    5. amount:this.number,
    6. }
    7. this.$http.insideWeChatPay(data).then( res => {
    8. if(res.data.code === 200){
    9. this.weChatParameter=res.data.data
    10. // console.log(this.weChatParameter,"微信内支付需要参数")
    11. this.weixinPay()
    12. }else{
    13. Toast({
    14. message: res.data.msg,
    15. position: 'middle',
    16. duration: 1000
    17. });
    18. }
    19. });
    20. } else if(this.wechatpayType == 'wxpay_php'){
    21. // console.log("微信外支付")
    22. let data={
    23. amount:this.number,
    24. }
    25. this.$http.outsideWeChatPay(data).then( res => {
    26. if(res.data.code === 200){
    27. let url=res.data.data
    28. window.location.replace(url) //这里是后端返回的URL直接进行跳转即可完成微信外支付
    29. }else{
    30. Toast({
    31. message: res.data.msg,
    32. position: 'middle',
    33. duration: 1000
    34. });
    35. }
    36. });
    37. }
    38. },
  4. 在调起支付的页面监听从其他页面返回的事件,进行一些刷新业务逻辑。

微信内支付根据官方API微信内置js对象 WeixinJSBridge,进行开发,至此微信浏览器内支付已经完成

  1. //解决微信内置对象报错
  2. weixinPay(data){
  3. var vm= this;
  4. if (typeof WeixinJSBridge == "undefined"){
  5. if( document.addEventListener ){
  6. document.addEventListener('WeixinJSBridgeReady', vm.onBridgeReady(data), false);
  7. }else if (document.attachEvent){
  8. document.attachEvent('WeixinJSBridgeReady', vm.onBridgeReady(data));
  9. document.attachEvent('onWeixinJSBridgeReady',vm.onBridgeReady(data));
  10. }
  11. }else{
  12. vm.onBridgeReady();
  13. }
  14. },
  15. //微信内置浏览器类,weChatParameter对象中的参数是3.步骤代码中从后端获取的数据
  16. onBridgeReady(){
  17. var vm = this;
  18. var timestamp=Math.round(vm.weChatParameter.timeStamp).toString();
  19. WeixinJSBridge.invoke(
  20. 'getBrandWCPayRequest',{
  21. debug:true,
  22. "appId":vm.weChatParameter.appId, //公众号名称,由商户传入
  23. "timeStamp":timestamp, //时间戳,自1970年以来的秒数
  24. "nonceStr":vm.weChatParameter.nonceStr, //随机串
  25. "package":vm.weChatParameter.package,
  26. "signType":vm.weChatParameter.signType, //微信签名方式:
  27. "paySign":vm.weChatParameter.paySign, //微信签名
  28. jsApiList: [
  29. 'chooseWXPay'
  30. ]
  31. },
  32. function(res){
  33. // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
  34. if(res.err_msg == "get_brand_wcpay_request:ok" ){
  35. Toast({
  36. message: '支付成功',
  37. position: 'middle',
  38. duration: 3000
  39. });
  40. vm.number=null
  41. vm.$router.go(-1)
  42. //window.location.href = vm.BASE_URL + 'index.html#/depositResult'
  43. }else{
  44. Toast({
  45. message: '支付失败',
  46. position: 'middle',
  47. duration: 3000
  48. });
  49. }
  50. }
  51. );
  52. },

二、支付宝支付

1.支付宝中的H5支付和PC端的一样,主要是后端的工作量,后端完成订单的生成之后返给前端的是form表单,前端只需要负责做页面的跳转即可:

  1. //立即支付按钮
  2. onSubmit() {
  3. if (this.payWay == 1) {
  4. //支付宝支付
  5. this.$router.push({ path: '/aliPay', query: { orderId: this.orderId}});
  6. } else if (this.payWay == 2) {
  7. //微信支付,这里跳转到本文的微信支付模块的3.步骤handelPay方法
  8. }
  9. },

2.选择支付宝方式之后进入支付宝承载页面:

  1. <template>
  2. <div v-html="html"></div>
  3. </template>
  4. <script>
  5. export default {
  6. data(){
  7. return{
  8. html:''
  9. }
  10. },
  11. methods:{
  12. fetchVideoPay(){
  13. let param={
  14. orderId: this.$route.query.orderId
  15. };
  16. this.$api.orderpage.videoAliPay(param).then( res => {
  17. this.html = res.data;
  18. this.$nextTick(() => {
  19. document.forms[0].submit() //渲染支付宝支付页面
  20. })
  21. })
  22. }
  23. },
  24. mounted(){
  25. this.fetchVideoPay()
  26. }
  27. }
  28. </script>

当然不想写承载页的还有其他方法调起支付,具体逻辑具体分析,根据不同的业务类型去变通比如:

  1. const div = document.createElement('div');
  2. div.innerHTML = (res.data); //res.data是返回的表单
  3. document.body.appendChild(div);
  4. document.forms.alipaysubmit.submit();

3.进入到支付宝支付页(至此但有一个问题,调起支付后,用户中途取消支付或者点返回键会整个网页一起关闭退出,或者一直在进入支付页面,不知道有没有更好的SEO方案)

发表评论

表情:
评论列表 (有 0 条评论,405人围观)

还没有评论,来说两句吧...

相关阅读