uniapp调用企业微信扫一扫支付怎么弄

admin 101 0
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-sdknpm install wechat-js-sdk --save)。
  • 对于小程序端,需在manifest.json中配置企业微信小程序AppID。

核心实现步骤

企业微信扫一扫支付的核心流程是:生成支付订单 → 生成支付二维码 → 用户扫码支付 → 商户接收支付结果,以下是具体实现步骤:

获取企业微信Access Token

企业微信API调用需使用Access Token,通过CorpidSecret获取,以下是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 '

标签: #企业微信 #扫码支付