feat: 购买下单透传终端类型,手机端收银台拉起支付宝 App(契约 v1.1.0)

根因:pay 判手机/PC 用下单请求 UA,而下单由 jiu 后端 Go client 发出,
恒被判 PC 扫码页——手机用户拿不到 wap 拉起页。

- backend:/license/purchase 请求体加可选 client_type(oneof=pc mobile),
  缺省按本请求 UA 兜底(官网浏览器购买自动受益);CreatePurchase 透传给 pay;
  单测断言透传 + 既有用例补参
- client:createPurchase 支持 clientType;PurchaseCard 按平台声明
  (iOS/Android=mobile,桌面=pc,Web 不传走 UA),kIsWeb 先于 dart:io;
  launchUrl 外部浏览器不变,wap 收银台自动拉起支付宝
- 配套:pay-contract v1.1.0(744725b)+ pay 侧 resolveIsMobile(dbdadd1)已各自提交

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
This commit is contained in:
wangjia
2026-07-04 10:31:49 +08:00
parent aa3aad417c
commit f3cfdcadca
5 changed files with 64 additions and 15 deletions
@@ -41,10 +41,16 @@ class LicenseRepository {
}
/// 在线购买/续费下单(仅管理员),返回 pay 收银台跳转信息。
Future<PurchaseOrder> createPurchase(String bizCode) async {
/// [clientType] 终端类型("pc"/"mobile",可选):显式声明收银台形态——
/// mobile 走支付宝手机网站支付(H5 拉起 App),pc 走电脑扫码页;
/// 不传时后端按请求 UA 判断(浏览器场景 UA 真实,App 场景须显式传)。
Future<PurchaseOrder> createPurchase(String bizCode,
{String? clientType}) async {
try {
final resp =
await _client.post('/license/purchase', data: {'biz_code': bizCode});
final resp = await _client.post('/license/purchase', data: {
'biz_code': bizCode,
if (clientType != null) 'client_type': clientType,
});
return PurchaseOrder.fromJson(resp.data['data'] as Map<String, dynamic>);
} on DioException catch (e) {
throw AppException(