uniapp调用企业微信扫一扫支付需先配置企业微信开发者账号,获取corpID与secret,并在manifest.json中添加企业微信SDK权限,通过uni.invoke接口调用企业微信扫一扫,获取支付二维码参数,将订单信息(如订单号、金额)与支付参数组合,调用企业微信支付API生成支付二维码,用户扫码后,企业微信回调通知支付结果,前端需通过轮询或WebSocket实时更新支付状态,完成支付流程闭环,需注意处理网络异常与用户取消操作,确保支付逻辑健壮。
UniApp调用企业微信扫一扫支付完整实现指南
在企业级应用开发中,通过UniApp实现企业微信生态内的支付功能已成为常见需求。"扫一扫支付"凭借其便捷性和高效性被广泛应用,尤其适用于线下门店、展会等场景,本文将详细介绍如何通过UniApp调用企业微信扫一扫支付功能,从前期准备工作到具体代码实现,帮助开发者快速掌握这一功能的开发流程,并确保支付过程安全可靠。
准备工作
在开始开发前,需完成以下准备工作,确保具备调用企业微信支付的基础条件:
企业微信账号认证
- 注册并认证企业微信账号(需提供企业资质),获取
Corpid(企业ID)。 - 登录企业微信管理后台,在"应用管理"中创建"自建应用",获取
AgentId(应用ID)和Secret(应用密钥)。 - 在应用详情页记录必要的配置信息,包括应用名称、应用图标等,这些信息将在支付过程中显示给用户。
开通企业微信支付
- 在企业微信管理后台的"企业微信支付"模块开通支付功能,完成商户入驻(需提供企业银行账户、营业执照等资料)。
- 获取
MerchantId(商户号)和APIv3密钥(在"账户中心 > API安全"中设置)。 - 确保企业微信支付功能已通过审核,状态显示为"已启用"。
配置支付授权目录
- 在企业微信管理后台的"自建应用 > 权限管理"中,添加"企业微信支付"权限。
- 在"网页授权及JS-SDK"中配置授权域名(如
https://yourdomain.com),确保支付请求能被企业微信授权。 - 注意:生产环境与测试环境需分别配置,且域名必须完整包含协议(http/https)。
安装UniApp依赖
- 确保UniApp项目已安装
@dcloudio/uni-app(建议使用最新稳定版)。 - 若涉及H5端调用,需安装企业微信JS-SDK:通过npm安装
wechat-js-sdk(npm install wechat-js-sdk --save)。 - 对于小程序端,需在manifest.json中配置企业微信小程序AppID。
核心实现步骤
企业微信扫一扫支付的核心流程是:生成支付订单 → 生成支付二维码 → 用户扫码支付 → 商户接收支付结果,以下是具体实现步骤:
获取企业微信Access Token
企业微信API调用需使用Access Token,通过Corpid和Secret获取,以下是UniApp中获取Token的方法(以H5端为例):
// 获取企业微信Access Token
async function getWechatWorkAccessToken() {
const corpid = 'your_corpid'; // 企业ID
const secret = 'your_secret'; // 应用密钥
const url = `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpid}&corpsecret=${secret}`;
try {
const [error, res] = await uni.request({ url });
if (error) {
console.error('请求异常:', error);
return null;
}
if (res.data.errcode === 0) {
// 建议将token缓存,有效期2小时
uni.setStorageSync('wechat_work_token', {
token: res.data.access_token,
expireTime: Date.now() + res.data.expires_in * 1000
});
return res.data.access_token;
} else {
console.error('获取Access Token失败:', res.data.errmsg);
return null;
}
} catch (error) {
console.error('请求异常:', error);
return null;
}
}
// 带缓存的token获取方法
async function getCachedAccessToken() {
const cached = uni.getStorageSync('wechat_work_token');
if (cached && cached.expireTime > Date.now()) {
return cached.token;
}
return await getWechatWorkAccessToken();
}
调用统一下单接口生成预支付订单
通过企业微信"统一下单"接口生成预支付订单,获取prepay_id,接口地址为:https://qyapi.weixin.qq.com/cgi-bin/pay/unifiedorder,需传入商户号、商品信息、回调地址等参数。
// 统一下单,生成预支付订单
async function createUnifiedOrder(orderData) {
const accessToken = await getCachedAccessToken();
if (!accessToken) {
uni.showToast({ title: '获取访问令牌失败', icon: 'none' });
return null;
}
const url = `https://qyapi.weixin.qq.com/cgi-bin/pay/unifiedorder?access_token=${accessToken}`;
// 请求参数(具体字段参考企业微信支付文档)
const params = {
merchant_id: 'your_merchant_id', // 商户号
appid: 'your_agent_id', // 应用ID(AgentId)
out_trade_no: orderData.orderId, // 商户订单号(需保证唯一)
total_fee: orderData.amount * 100, // 金额(单位:分)
spbill_create_ip: '127.0.0.1', // 终端IP(生产环境需使用真实IP)
notify_url: 'https://yourdomain.com/pay/notify', // 支付结果回调地址
body: orderData.productName, // 商品描述
scene_info: {
payer_client_ip: '127.0.0.1' // 用户终端IP
}
};
try {
const [error, res] = await uni.request({
url,
method: 'POST',
data: params,
header: {
'Content-Type': 'application/json'
}
});
if (error) {
console.error('请求异常:', error);
return null;
}
if (res.data.return_code === 'SUCCESS' && res.data.result_code === 'SUCCESS') {
return res.data; // 返回包含prepay_id的数据
} else {
console.error('统一下单失败:', res.data.return_msg);
uni.showToast({ title: '创建订单失败: ' + res.data.return_msg, icon: 'none' });
return null;
}
} catch (error) {
console.error('请求异常:', error);
return null;
}
}
生成支付二维码
获取prepay_id后,通过"生成支付二维码"接口生成二维码图片,供用户扫码支付。
后端生成二维码(推荐)
后端通过prepay_id调用企业微信接口生成二维码图片,返回图片Base64或URL,前端直接展示,这种方式安全性更高,避免敏感信息泄露。
// 前端请求后端生成二维码(示例)
async function getQRCode(prepayId) {
const url = 'https://yourdomain.com/api/pay/generate-qrcode';
try {
const [error, res] = await uni.request({
url,
method: 'POST',
data: {
prepay_id: prepayId,
timestamp: Date.now() // 用于防止缓存
}
});
if (error) {
console.error('获取二维码失败:', error);
return null;
}
if (res.data.code === 200) {
return res.data.data.qrCodeUrl; // 返回二维码图片URL
} else {
uni.showToast({ title: res.data.message, icon: 'none' });
return null;
}
} catch (error) {
console.error('获取二维码失败:', error);
return null;
}
}
前端生成二维码(需引入qrcode库)
若前端直接生成,可使用qrcode库将prepay_id转换为二维码图片:
// 安装qrcode库:npm install qrcode import QRCode from '