微信扫码登录与微信支付流程详解
一、微信扫码登录
微信扫码登录是一种常见的用户授权登录方式,用户通过微信客户端扫码授权登录,后端通过微信官方 API 获取用户信息。下面是微信扫码登录的具体流程:
1. 配置回调地址
首先需要配置微信登录的回调地址,确保微信服务器能够访问你的后端服务。回调地址用于接收微信的授权回调请求。
2. 拼接扫码地址
将微信开放平台的 appid
、回调接口地址以及 state
参数拼接到微信官方的扫码 URL 上:
https://open.weixin.qq.com/connect/qrconnect?appid={appid}&redirect_uri={回调地址}&response_type=code&scope=snsapi_login&state={state}
用户扫码之后会跳转到回调地址,并附带 code
和 state
参数。
3. 用户授权并回调
用户同意授权后,微信会将用户的授权 code
传递到你配置的回调地址。
4. 获取 Access Token
在后端中,使用 appid
、appsecret
和 code
调用微信官方接口,获取 access_token
和 openid
:
url代码 https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={appsecret}&code={code}&grant_type=authorization_code
5. 获取用户信息
使用获取到的 access_token
和 openid
,调用微信接口获取用户的详细信息:
url代码 https://api.weixin.qq.com/sns/userinfo?access_token={access_token}&openid={openid}&lang=zh_CN
后端返回的用户信息可以包含昵称、头像等,后续可以根据业务需求处理登录流程。
二、微信支付流程
微信支付是广泛使用的支付方式之一,用户通过扫描二维码完成支付。下面是微信支付的完整流程:
1. 配置回调接口和商户信息
首先,需要在微信商户平台中配置支付回调接口,确保回调接口能够正常接收微信支付结果。此外,还需要准备商户 ID 和 APIv2 密钥。
2. 下单并生成签名
在用户发起支付请求后,后端会生成订单,并调用微信的统一下单接口。生成订单的同时,需要生成签名。
生成签名的步骤如下:
java代码// 生成签名参数
SortedMap<String, String> params = new TreeMap<>();
params.put("appid", weChatConfig.getAppId());
params.put("mch_id", weChatConfig.getMchId());
params.put("nonce_str", CommonUtils.generateUUID());
params.put("body", videoOrder.getVideoTitle());
params.put("out_trade_no", videoOrder.getOutTradeNo());
params.put("total_fee", videoOrder.getTotalFee().toString());
params.put("spbill_create_ip", videoOrder.getIp());
params.put("notify_url", weChatConfig.getPayCallbackUrl());
params.put("trade_type", "NATIVE");
// 生成签名
String sign = WxPayUtils.createSign(params, weChatConfig.getKey());
params.put("sign", sign);
3. 转换签名为 XML
签名生成后,将参数转换为 XML 格式,准备请求微信支付接口。
4. 请求微信支付二维码接口
将生成的 XML 作为参数,发送到微信的支付接口以获取支付二维码。用户扫码支付后,微信会回调你配置的支付通知接口。
5. 验证签名
微信支付成功后,会调用你的回调接口,并传递 XML 格式的数据。你需要将 XML 转为 Map,并验证微信返回的 sign
与本地生成的签名是否一致,确保数据的安全性:
java代码// 将XML转为Map,并验证签名
Map<String, String> resultMap = WxPayUtils.xmlToMap(responseXml);
String resultSign = resultMap.get("sign");
String localSign = WxPayUtils.createSign(resultMap, weChatConfig.getKey());
if (resultSign.equals(localSign)) {
// 验证成功,处理订单逻辑
}
6. 更新订单状态
通过回调接口中的订单号,更新订单支付状态为已支付。
7. 通知微信支付成功
最后,通知微信支付成功。返回如下内容:
xml代码
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>
后端可以通过 response.setContentType("text/xml");
将成功消息返回给微信,确保流程完成。