UniApp H5联调 微信支付/支付宝支付(带详细注释)

支付宝支付

1.首先要在HBuilder X 找到 manifest.json  找到App 模块配置 把Payment(支付) 勾选上

2. 因为我做的是H5, 调用支付宝支付的时候, 是通过后端返回的二进制的数据, 前端通过Vue-qrcode 转译成二维码

3. 然后因为这个二维码是微信跟支付宝都可以扫描的, 我们也通常把这个叫做融合支付, 详细的就是说 通过支付宝扫描是直接进入支付宝的环境,通过微信扫描是进入的微信的环境

4 .首先支付宝支付的话,一些基础的数据都是后端给咱们前端返回的

5.  http://192.168.3.63:8080/#/pages/ParkingFee/ParkingFee?app_id=902100013xxxxx1646&source=alipay_wallet&scope=auth_base&state=ZmZjZDk3MDI2OGY2NDY1xxxxQ5NTcxMTdlYzNlYzU%3D&auth_code=3855fa60c6d749219f111b8945xxxX97   这一串是后端给我返回的数据, 前端用到的数据也就没几个, 我来给大家说一下是什么意思

6. http://192.168.3.63:8080/#/pages/ParkingFee/ParkingFee  这个是我页面的路径

7. app_id=902100013xxxxx646   app_id就是获取支付宝授权的唯一标识

8.state=ZmZjZDk3MDI2OGY2xxxMDljNmQ5NTcxMTdlYzNlYzU%3D   商家自定义参数

9.auth_code=3855fa60c6d749219f111bxxxxxx97   用户信息授权的信息

// 首先在onLoad 中接收扫码过后跳转的数据

onLoad(options) {
  // 将传递过来的支付信息存储到当前实例的alipayInfo属性中
  this.alipayInfo = options;

  // 判断当前用户代理是否为支付宝
  if (this.userAgent.indexOf('alipay') !== -1) {
    // 当用户代理为支付宝时,解析state参数
    const encodedString = this.alipayInfo.state;

    // 转译Base64
    if (encodedString) {
      this.randomId = atob(encodedString);
    } else {
      return; // 如果state参数不存在,直接返回
    }

    // 调用支付函数,传入支付宝的app_id和auth_code
    this.paymentFn(this.alipayInfo.app_id, this.alipayInfo.auth_code);
  }

  // 调用获取支付订单信息函数,传入randomId
  this.getPayOrderInfoFn(this.randomId);
}
export default {
		data() {
			return {
				userAgent,
				type: 1,
				// 订单详细
				info: {},
				// 支付信息
				alipayInfo: {},
				// 支付宝token
				access_token: "",
				user_id: "",
				// 支付宝交易码
				tradeNO: "",
                // 订单id
				randomId: '',
			};
		},

// 首先获取该条订单的信息数据
getPayOrderInfoFn(randomId) {
    // 调用后端接口
    getPayOrderInfo(randomId).then((res) => {
          this.info = res.data
    })
}

// 获取支付宝授权
paymentFn(app_id, auth_code) {
    userpay(app_id, auth_code).then((res) => {
        // 注意这里需要转一下格式
        const parsedResponse = JSON.parse(res);
        const oauthResponse = parsedResponse.alipay_system_oauth_token_response;
        // 从中取出 access_token 跟 user_id
        // 想拉起支付宝收银台这两个是必须要有的(详细看支付宝开发文档)
        this.access_token = oauthResponse.access_token;
        this.user_id = oauthResponse.user_id;
    })
}

10. 现在支付字段已经都准备好了,下面开始调用支付宝收银台

// html 部分

<u-button type="primary" @click="userInfoPayFn">立即缴费</u-button>

// Js 部分
userInfoPayFn() {
    // 判断是否在支付宝浏览器
    if (userAgent.indexOf('alipay') !== -1) {
        let data = {
            userId: this.user_id, // 用户id
            openId: this.user_id, // 用户id
            topUpAmount: this.info.paycharge, // 支付金额
            payType: 'ALIPAYCLIENT', // 支付类型
            buyerLogonId: this.user_id, // 用户id
            orderNo: this.info.id, // 订单号
            appAuthToken: this.access_token // 后端返回的token
        }
        // 获取支付宝交易码
        userInfoPay(data).then((res)=> {
            // 还是同样的方法 需要转换格式
            const parsedResponse = JSON.parse(res.data);
            const oauthResponse = parsedResponse.alipay_trade_create_response;
            // 40004 这是支付宝官方定义的失败code码
            if (oauthResponse.code == 40004) {
                uni.showToast({
                    title: `${oauthResponse.sub_msg}`,
                    icon: 'none', //如果要纯文本,不要icon,将值设为'none'
                    duration: 2000 //持续时间为 2秒
                })
            }
            // 拉起支付宝收银台  trade_no = 支付宝交易号
            this.callAlipay(oauthResponse.trade_no);
        })
    }
},

// 拉取支付宝收银台
callAlipay(id) {
  // 判断是否存在支付宝的JSBridge
  if (window.AlipayJSBridge) {
    // 调用支付宝客户端接口,执行支付操作
    AlipayJSBridge.call('tradePay', {
      tradeNO: id
    }, function(result) {
      if (result.resultCode === '9000') {
        // 支付成功
        uni.$u.toast('支付成功!');
        setTimeout(() => {
          uni.reLaunch({
            url: '/pages/success/success'
          });
        }, 500);
      } else {
        // 支付失败
        uni.$u.toast('支付失败');
        setTimeout(() => {
          uni.reLaunch({
            url: '/pages/fail/fail'
          });
        }, 500);
      }
    });
  } else {
    // 如果支付宝的JSBridge尚未准备好,在文档中添加AlipayJSBridgeReady事件监听器
    document.addEventListener('AlipayJSBridgeReady', () => {
      // 准备就绪后再次调用支付函数,传入支付数据paymentData
      this.callAlipay(paymentData);
    });
  }
}

11. 说到这里支付宝支付 已经说完了, 支付宝支付前端可以跟后端调试的话得在支付宝沙箱环境下调试

 微信支付

1. .首先要在HBuilder X 找到 manifest.json 把Payment支付勾上 还有就是一个 appid 需要后台给你.

2. 要调后端的预生成 订单 信息接口 去获取订单信息

3. weix.js 组件


// weix.js
// 首先尝试从本地存储中获取,如果不存在则尝试从URL参数中获取code,如果没有code则进行微信授权跳转,最终获取openId。获取过程中使用了getOpenIdBycode接口来获取openId。
import { getOpenIdBycode } from "@/api/mobileCharging.js";

export default {
  data() {
    return {
      openId: "",
      appId: ""
    };
  },
  mounted() {
    // 获取本地存储的openId和appId
    let openId = uni.getStorageSync('wx_openid');
    let appId = uni.getStorageSync('wx_appId');
    
    console.log('openId', openId);
    
    if (openId && appId) {
      // 如果本地存储中已经存在openId和appId,则直接使用
      this.openId = openId;
      this.appId = appId;
      return true;
    }
    
    // 如果本地存储中不存在openId和appId,则尝试从URL参数中获取code
    let code = this.getUrlKey('code');
    
    if (!code) {
      // 如果URL参数中没有code,则进行微信授权跳转获取code
      this.appId = 'wx0b3c40b8569affa2'; // 替换成你的公众号的AppID
      uni.setStorageSync('wx_appId', this.appId);
      
      let url =
        `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${this.appId}&redirect_uri=` +
        encodeURIComponent(location.href) + "&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
      location.href = url;
    } else {
      // 如果从URL参数中获取到了code,则调用接口获取openId
      getOpenIdBycode(code).then(res => {
        this.openId = res.data.openId;
        uni.setStorageSync('wx_openid', res.data.openId);
      });
    }
  },
  methods: {
    getUrlKey(name) {
      // 辅助函数,从URL中获取指定名称的参数值
      return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ""])[1].replace(/\+/g, '%20')) || null;
    }
  }
};

4. 主页面

// 首先我是引入了一个组件 (获取微信的openId和appId)
import weix from "@/common/weix.js";
// 这一行从浏览器中获取 userAgent 字符串 userAgent 字符串包含有关用户浏览器 设备和操作系统的信息 通过转换为小写 可以更容易地进行大小写不敏感的检查
const userAgent = navigator.userAgent.toLowerCase();
// 插件  npm i  jweixin-module --save
const wx = require('jweixin-module');

export default {
	data() {
		return {
			userAgent,
            // 订单详细
            info: {},
            // 订单id
            randomId: '',
           }
     }
},

mixins: userAgent.indexOf('micromessenger') !== -1 ? [weix] : [],

// 首先在onLoad 中接收扫码过后跳转的数据

onLoad(options) {
  // 将传递过来的支付信息存储到当前实例的alipayInfo属性中
  this.alipayInfo = options;

  // 判断当前用户代理是否为微信
  if (this.userAgent.indexOf('micromessenger') !== -1) {
    // 订单id 来获取该条订单的全部数据
    this.randomId = this.alipayInfo.randomId;
  }

  // 调用获取支付订单信息函数,传入randomId
  this.getPayOrderInfoFn(this.randomId);
},
methods: {
    // 首先获取该条订单的信息数据
    getPayOrderInfoFn(randomId) {
        // 调用后端接口
        getPayOrderInfo(randomId).then((res) => {
              this.info = res.data
        })
    },
    // 点击缴费
   userInfoPayFn() {
    // 获取用户的 User Agent 字符串
    const userAgent = navigator.userAgent.toLowerCase();
    
    // 判断是否在微信浏览器
    if (userAgent.indexOf('micromessenger') !== -1) {
        console.log('在微信浏览器');

        // 构建支付所需的参数对象
        let data = {
            userId: this.openId,            // 用户id
            openId: this.openId,            // 用户id
            topUpAmount: this.info.paycharge,  // 支付金额
            payType: 'MICROMESSENGER',     // 支付类型
            buyerLogonId: this.openId,       // 用户id
            tradeType: 0,                   // 停车缴费/月卡
            orderNo: this.info.id,          // 订单号
            // appAuthToken: this.access_token // 后端返回的token
        }
        
        // 打印微信支付参数到控制台
        console.log('微信支付参数', data);
        
        // 获取微信支付信息
        userInfoPay(data).then((res) => {
            // 解析后端返回的支付参数
            let payParams = JSON.parse(res.data)

            // 配置微信支付参数
            wx.config({
                debug: false,
                appId: 'wx0b3c40b8569affa2',   // 公众号ID 
                // appId: uni.getAppBaseInfo().host.appId, // 公众号ID 
                timestamp: payParams.timestamp, // 时间戳,自1970年以来的秒数
                nonceStr: payParams.nonceStr,   // 随机串
                signature: payParams.sign,      // 微信签名方式
                jsApiList: ['chooseWXPay']
            });

            // 初始化微信支付
            wx.ready(() => {
                // 在这里调用微信支付接口
                this.callWechatPay(payParams);
            });
        })
     }
  },

  // 拉取微信收银台
  callWechatPay(params) {
    // 调用微信支付接口
    wx.chooseWXPay({
        timestamp: params.timeStamp,    // 时间戳
        nonceStr: params.nonceStr,      // 随机串
        package: params.package,        // 订单详情扩展字符串
        signType: 'MD5',                // 签名方式
        paySign: params.sign,           // 签名
        success: function(res) {
            // 支付成功后的回调函数
            console.log('Payment succeeded', res);
            uni.$u.toast('支付成功!')
            setTimeout(() => {
                uni.reLaunch({
                    url: '/pages/success/success'
                })
            }, 500)
        },
        fail: function(res) {
            // 支付失败后的回调函数
            console.error('Payment failed', res);
            uni.$u.toast('支付失败')
            setTimeout(() => {
                uni.reLaunch({
                    url: '/pages/fail/fail'
                })
            }, 500)
        }
      });
  },

}

总结:  这是支付宝微信支付 的全部流程,我写的也有不足的地方,但是对接支付完全够用了,望大家采纳!

要在uniapp中开发H5登录微信公众号并进行联调,有以下几个步骤: 1. 获取微信开发者账号和相关配置信息:首先需要在微信开放平台注册并创建一个开发者账号,然后创建一个微信公众号,并获取相应的AppID和AppSecret等配置信息。 2. 在uniapp项目中配置相关插件:在uniapp项目的manifest.json文件中,添加对应的插件配置,如"@dcloudio/uni-mp-weixin"插件。然后在项目的App.vue中通过uni.login方法获取登录凭证code,并调用uni.request方法发送请求到服务器获取用户的openid和session_key。 3. 前端与后端的联调:根据服务器返回的用户openid和session_key,在前端进行相关的业务逻辑处理,如展示用户信息、跳转到其他页面等。其中,服务器端需要处理用户的登录请求,并返回openid和session_key等信息给前端。 4. 微信公众号授权设置:在微信公众号后台设置中,配置网页授权域名和回调地址,并将uniapp项目的H5链接添加到公众号菜单中。 5. 测试和调试:完成以上步骤后,进行测试和调试,确保登录功能在H5中正常使用。可以通过调试工具、日志打印等方式进行定位和解决问题。 总结:在uniapp开发H5登录微信公众号的联调过程中,需要进行微信开发者账号和相关配置的准备,配置相关插件和设置,前端与后端的联调,以及进行测试和调试。通过这些步骤,可以实现在uniapp项目中登录微信公众号并进行H5联调
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值