微信小程序的登录和支付流程是什么?

先理解原理和示例,再练习完整口述与追问。

登录:小程序调用 wx.login 拿到一次性 code,发给自己的服务端;服务端用 appid、secret 和 code 调用 code2Session 换取 openid 与 session_key,生成自己的登录态返回。session_key 不能下发给前端。支付:服务端下单获取 prepay_id 并签名,前端调用 wx.requestPayment 拉起支付,最终结果以服务端收到的支付通知或主动查单为准。

code 有效期很短且只能使用一次。openid 在同一小程序内唯一标识用户,unionid 在同一开放平台下的多个应用间统一。session_key 用于解密手机号等敏感数据,必须留在服务端;获取手机号现在通过按钮 open-type="getPhoneNumber" 拿到 code,再由服务端调用接口换取。wx.checkSession 可检查 session_key 是否过期。

支付流程中,金额由服务端根据订单计算,前端不能传金额;服务端调用微信支付下单接口得到 prepay_id,用商户私钥生成签名参数(timeStamp、nonceStr、package、signType、paySign)返回前端。requestPayment 的成功回调只代表用户操作完成,不保证到账,服务端要验证微信回调签名,幂等更新订单状态,前端展示结果时再查询订单。

用户点击“支付”→ 前端调用 /orders/123/pay → 服务端校验订单状态、计算金额、调用下单接口 → 返回支付参数 → 前端 wx.requestPayment → 成功或取消都跳到结果页轮询订单状态 → 服务端收到支付通知后更新为已支付。

把 appsecret 写在小程序代码中会被反编译获取;以前端支付回调作为发货依据会被伪造;支付通知可能重复发送,处理逻辑必须幂等。

登录是小程序调 wx.login 拿临时 code,发给服务端,服务端用 appid、secret 调 code2Session 换 openid 和 session_key,再生成自己的登录态返回,session_key 和 secret 都不能到前端。支付是服务端按订单计算金额,调用下单接口拿 prepay_id 并签名,前端用这些参数调 wx.requestPayment;前端回调只代表用户操作结束,最终以服务端验证过签名的支付通知或查单为准,处理要幂等。