news 2026/7/5 2:13:11

微信登录 + 微信支付 业务逻辑分步详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微信登录 + 微信支付 业务逻辑分步详解

前置说明

两套能力都依赖微信开放平台,区分两种账号:

  1. 微信开放平台(网站 / APP 登录、APP 支付)open.weixin.qq.com
    • 移动应用:APP 微信一键登录、APP 内微信支付
    • 网站应用:PC 网页微信扫码登录、JSAPI 网页支付
  2. 微信公众号平台(公众号 H5)mp.weixin.qq.com
    • 公众号内 H5 微信授权登录、JSAPI 支付
  3. 小程序:单独小程序后台,登录 / 支付逻辑略有差异

第一部分:微信授权登录(分 3 种场景:APP 登录 / 网页扫码登录 / 公众号 H5 授权)

一、APP 微信一键登录

整体流程总览

用户点击微信登录 → 跳转微信 APP 授权 → 微信返回临时授权 code → 后端用 code 请求微信接口获取 openid + 用户信息 → 后端根据 openid 绑定 / 注册本系统账号,生成自身登录 token

步骤 1:平台准备工作

  1. 登录微信开放平台,创建「移动应用」,填写应用包名、签名(安卓应用签名必须严格一致,否则跳转微信失败)
  2. 应用审核通过,获取AppIDAppSecret(密钥后端保存,前端不能暴露)
  3. 前端集成微信官方 SDK(微信开放平台 SDK)

步骤 2:前端 APP 拉起微信授权

  1. 用户点击【微信登录】按钮
  2. 前端调用微信 SDK 发起授权请求,携带当前应用 AppID
  3. 自动跳转微信客户端,弹出授权弹窗:是否允许获取昵称、头像
  4. 用户两种操作:
    • 拒绝授权:前端收到取消回调,登录流程终止
    • 同意授权:微信跳转回 APP,携带临时授权码 code(一次性,5 分钟有效期)

步骤 3:前端把 code 传给后端接口

前端不能直接拿 code 去微信请求用户信息(会泄露 AppSecret),必须把 code 提交给后端服务。 请求参数:code、设备标识、前端随机 state 防重放

步骤 4:后端调用微信凭证接口,换取用户唯一标识

后端调用微信官方接口:GET https://api.weixin.qq.com/sns/oauth2/access_token请求参数:

plaintext

appid=xxx secret=xxx code=前端传来的临时code grant_type=authorization_code
微信返回数据(核心字段)
  1. openid:用户在当前 APP 下唯一标识(核心主键,每个应用 openid 隔离)
  2. access_token:微信用户凭证,用于拉取用户头像昵称
  3. refresh_token:刷新凭证,有效期 30 天
  4. expires_in:access_token 有效期(2 小时)

步骤 5:后端拉取用户基础信息(昵称、头像、性别)

调用接口:https://api.weixin.qq.com/sns/userinfo参数:access_token+openid返回:nickname、headimgurl、sex、城市等公开信息

步骤 6:后端业务账号绑定逻辑(核心业务)

  1. 根据openid查询用户表:
    • 情况 A:数据库存在该 openid → 直接生成系统登录 token(JWT)返回前端,完成登录
    • 情况 B:无 openid 记录 → 自动注册新用户,将 openid、昵称、头像存入用户表,再下发登录 token
  2. 特殊业务:如果系统需要手机号绑定,登录成功后弹出绑定手机号弹窗

步骤 7:前端接收 token,完成登录状态保持

前端存储 JWT,后续所有业务请求头部携带 token 鉴权; 登录流程结束。

补充:网页扫码登录

  1. 后端携带 AppID、回调地址、随机 state,调用微信接口生成二维码
  2. 前端展示二维码,用户微信扫码
  3. 用户手机确认授权,微信自动跳转配置的回调域名
  4. 回调地址携带临时 code,后端接收 code,流程同 APP 登录,换取 openid 完成登录

补充:公众号 H5 授权登录

  1. 前端跳转微信授权链接,scope 分两种:
    • snsapi_base:静默授权,仅获取 openid,不弹窗
    • snsapi_userinfo:弹窗授权,获取头像昵称
  2. 跳转后微信重定向到业务页面,带回 code
  3. 后端用 code 换取 openid、用户信息,绑定账号逻辑同上

登录通用关键注意点

  1. AppSecret 只能存后端,绝对不能放前端 / 客户端,泄露会被盗取用户信息
  2. code 一次性有效,只能使用一次,重复调用会报错
  3. state 随机串,用于防止 CSRF 攻击,前后端校验一致
  4. openid 隔离:同一用户,不同 APP / 公众号,openid 不一样;如需统一标识,使用UnionID(开放平台绑定多个应用后启用)
  5. 微信 access_token 分两种:用户授权 token、平台全局 access_token(支付 / 接口调用凭证,分开不可混用)

第二部分:微信支付完整全流程

核心概念区分

  1. JSAPI 支付:微信公众号内 H5 页面调起支付弹窗
  2. APP 支付:安卓 /iOS APP 内唤起微信支付
  3. 小程序支付:小程序专属支付逻辑
  4. 统一前提:必须开通微信支付商户平台,获取商户号、支付密钥、证书

前置商户配置

  1. 微信开放平台 / 公众号平台绑定微信支付商户号
  2. 登录商户平台:
    • 设置 API 支付密钥(32 位字符串,后端加密签名用)
    • 下载商户支付证书(.p12文件,退款、企业转账必须使用证书双向加密)
    • 配置支付回调通知地址(后端公网可访问接口,微信异步推送支付结果)
  3. 保存核心凭证:
    • 应用 AppID / 公众号 AppID
    • 商户号 mch_id
    • API 密钥 key
    • 商户证书文件

完整标准支付流程

步骤 1:前端提交下单商品信息到后端创建业务订单

前端传商品 ID、数量、支付金额、用户 ID,后端业务操作:

  1. 校验商品库存、价格、用户登录状态
  2. 生成本地业务订单号(唯一,系统内部标识订单)
  3. 数据库新建订单,状态标记为「待支付」,保存金额、商品、用户信息

步骤 2:后端调用微信统一下单接口,生成预支付订单(核心)

后端主动请求微信支付统一接口:https://api.mch.weixin.qq.com/pay/unifiedorder

请求必填参数(关键)
  1. appid:应用 ID
  2. mch_id:商户号
  3. out_trade_no后端自定义业务订单号(唯一)
  4. total_fee:支付总金额,单位分(不能传元)
  5. spbill_create_ip:客户端真实 IP
  6. notify_url:支付结果异步回调地址(公网 HTTPS 接口,微信主动 POST 推送支付结果)
  7. trade_type:交易类型
    • APP 支付:APP
    • 公众号 H5:JSAPI
  8. openid:JSAPI 支付必填,当前登录用户微信 openid;APP 支付不需要
签名规则
  1. 所有非空参数按字典升序排序
  2. key=商户密钥拼接在末尾
  3. MD5 加密,转大写得到 sign 签名,随参数提交
微信返回预支付结果

成功返回prepay_id(预支付交易会话标识,有效期 2 小时,调起支付必须参数)

步骤 3:后端封装调起支付所需参数,返回给前端

不同端返回参数不同:

  1. APP 支付:返回prepay_id、商户号、AppID、时间戳、随机串、签名
  2. JSAPI 公众号支付:返回package="prepay_id=xxxx"、timestamp、nonceStr、signType、paySign 前端拿到全套参数,调用微信 SDK 拉起支付弹窗

步骤 4:用户在微信完成支付操作

  1. 前端唤起微信支付弹窗,展示金额、商品名称
  2. 用户输入微信支付密码 / 指纹 / 面容验证
  3. 支付分两种结果:
    • 支付成功:微信后台生成支付流水,异步推送回调通知到后端配置的 notify_url
    • 用户主动关闭支付弹窗:前端收到取消,前端提示用户未支付,业务订单状态不变

步骤 5:微信异步回调通知后端

重点:绝对不能以前端支付成功页面回调作为订单更新依据,存在前端篡改、页面关闭丢失消息风险,唯一可信依据是微信后端异步 POST 回调

  1. 用户支付成功后,微信服务器主动 POST 请求后端配置的notify_url接口,传递 XML 格式支付结果数据
  2. 后端处理回调完整步骤: ① 接收微信 XML 参数,解析所有字段 ② 本地重新计算签名,和微信传来的 sign 对比,校验签名合法性(防止伪造回调请求)③ 校验订单金额、商户号、AppID 与本地订单记录一致,防止篡改金额 ④ 根据out_trade_no业务订单号,更新数据库订单状态为「已支付」,记录微信官方交易流水号transaction_id⑤ 业务后续操作:发放优惠券、扣减库存、生成发货单、充值到账等 ⑥ 后端返回固定 XML 字符串给微信:<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>
    • 返回 SUCCESS:微信不再重复推送回调
    • 返回 FAIL / 异常:微信会持续重试推送(间隔 5/15/30 分钟,最多推送 8 次)

步骤 6:前端轮询订单状态,同步页面展示

前端支付弹窗关闭后,定时调用后端订单查询接口,查询订单状态:

  1. 已支付:跳转到支付成功页面,展示订单详情
  2. 待支付:提示用户未付款,可重新唤起支付
  3. 已关闭:订单超时失效

补充:主动查询订单接口

场景:微信回调网络异常、回调接口报错,导致后端未收到支付通知 后端定时任务 / 前端主动查询,调用微信订单查询接口:https://api.mch.weixin.qq.com/pay/orderquery传入业务订单号,主动获取最新支付状态,同步本地订单数据,作为回调丢失的兜底方案

支付超时关闭订单逻辑

  1. 后端下单时设置订单 30 分钟有效期
  2. 定时任务扫描超过 30 分钟「待支付」订单
  3. 调用微信关闭订单接口关闭预支付单,本地订单状态改为「已超时关闭」,释放库存

第三部分:微信退款完整流程

前置要求

退款接口必须使用商户证书双向认证,仅密钥无法调用

步骤 1:前端 / 后台发起退款申请

运营 / 用户申请退款,前端传递业务订单号、退款金额、退款原因

步骤 2:后端校验退款条件

  1. 订单状态必须为「已支付、未退款」
  2. 退款金额 ≤ 原支付金额,支持部分多次退款
  3. 订单未超过微信退款有效期(支付后 180 天内可退款)

步骤 3:后端调用微信退款接口

接口地址:https://api.mch.weixin.qq.com/secapi/pay/refund请求携带商户证书、原订单号、退款单号、退款金额,生成签名提交

步骤 4:微信同步返回退款受理结果

受理成功代表退款进入处理队列,资金原路退回用户微信零钱 / 银行卡; 退款结果同样会异步推送回调到 notify_url,后端更新订单为「已退款」

第四部分:登录 + 支付通用高频坑点汇总

登录坑

  1. 前端直接请求微信接口获取用户信息,泄露 AppSecret,存在安全风险
  2. code 重复使用,重复调用接口报错
  3. 未校验 state,存在 CSRF 劫持风险
  4. 混淆普通 access_token 和用户授权 access_token,接口调用报错
  5. 安卓应用签名填写错误,无法跳转微信授权

支付坑

  1. 金额单位传元而非分,导致金额错误
  2. 签名排序错误、密钥写错,调不起支付弹窗
  3. 回调接口未做签名校验,被恶意伪造支付通知篡改订单
  4. 回调接口未正确返回 SUCCESS,微信无限重复推送回调,重复执行业务逻辑(需做幂等处理,根据订单号加锁防重复更新)
  5. 退款未携带商户证书,接口调用 403 拒绝访问
  6. 依赖前端支付成功回调更新订单,用户断网、关闭页面导致订单状态不一致
  7. notify_url 必须公网可访问,本地localhost、内网地址微信无法推送回调
  8. 预支付订单过期未重新下单,用户无法唤起支付

第五部分:完整业务整体链路总结

  1. 用户打开页面 → 微信登录授权 → 后端获取 openid 完成账号登录,下发系统 token
  2. 选商品下单,后端生成本地业务订单(待支付)
  3. 后端调用微信统一下单,获取 prepay_id,返回参数给前端唤起支付
  4. 用户微信付款,微信异步推送支付回调到后端
  5. 后端验签、更新订单为已支付,执行业务逻辑(发券、扣库存)
  6. 前端轮询订单状态,展示支付成功页面
  7. 如需退款:后台发起退款,调用微信退款接口,资金原路返还用户
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 2:12:51

自动扩缩容:3 种策略的适用场景

为什么需要自动扩缩容 API 服务的流量不是恒定的: 工作日 vs 周末(白天高、夜间低)营销活动(突发 5-10 倍)日常波动(20%) 固定容量的问题: 容量过小:流量高峰打爆,服务不可用容量过大:闲时浪费,白付钱 自动扩缩容:跟着流量走,既不爆也不浪费。 3 种策略 策略 1:反应式扩…

作者头像 李华
网站建设 2026/7/5 2:05:41

记录arm64内核调试环境搭建qemu_arm64_linux_01

先准备busybox busyboxcd ~ wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2 tar -xvf busybox-1.36.1.tar.bz2 cd busybox-1.36.1# 配置 BusyBox make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- defconfig # 启用静态编译&#xff08;关键&#xff1a;无需动态…

作者头像 李华
网站建设 2026/7/5 2:05:02

Rust AI 工具配置层级:命令参数、环境变量和配置文件别打架

Rust AI 工具配置层级&#xff1a;命令参数、环境变量和配置文件别打架 一、配置来源多了就容易混乱 Rust AI 工具通常会读取命令行参数、环境变量、配置文件和默认值。功能少时问题不大&#xff0c;功能多了以后&#xff0c;很容易出现同一个配置在多个地方被设置&#xff0c;…

作者头像 李华