尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Flutter支付集成全攻略:支付宝与微信支付从配置到踩坑

Flutter支付集成全攻略:支付宝与微信支付从配置到踩坑 做Flutter支付集成这件事几乎每个商业项目都绕不过去。国内移动端支付场景基本被支付宝和微信支付两家覆盖只要你的App涉及交易就逃不开这两条SDK的接入。而Flutter生态里支付没有纯Dart层实现——官方SDK全是原生库必须通过Platform Channel桥接再加上服务端下单、客户端拉起、异步回调、验签这一整条链路很多第一次接支付的同学都会被绕晕。这篇文章会把支付宝和微信支付在Flutter里的全平台集成完整拆一遍。包括方案选型、开放平台配置、服务端下单与签名、Flutter端调用与回调处理、Android/iOS/鸿蒙的适配差异以及我实际踩过的坑。如果你正准备给Flutter项目接入支付或者接了但回调总是不稳定、签名一直报错这篇文章应该能帮你省不少时间。1. 集成方案选型先想清楚再动手1.1 为什么Flutter没有“纯Dart”的支付SDK很多人第一次搜“Flutter支付宝SDK”会有点懵官方Pub上似乎没有支付宝直连的插件微信支付相关的第三方包倒是不少但质量和维护状态参差不齐。为什么不直接出Dart版SDK原因其实很实在。支付SDK不是普通的网络请求库它牵扯到大量原生系统能力——安全键盘、系统指纹组件、底层签名校验、应用间跳转、回调解析这些能力Dart根本碰不到必须调用原生代码。支付宝和微信的iOS/Android SDK都是闭源二进制库不可能重写成Dart。所以Flutter端的支付实现本质上是把原生SDK包一层Plugin暴露一个窄接口给Dart层调用。理解这件事很重要。因为它决定了你后面遇到问题时的排查方向大部分“奇怪的问题”不是Dart代码写错了而是原生层的配置、签名、URL Scheme、回调声明出了问题。我在多次排查后发现支付问题有个规律——90%的报错根因都在原生配置不在Flutter业务代码。1.2 三种主流集成方案怎么选我接到过很多“帮我看看支付为什么不回调”的咨询每次我都会先问对方用的什么方案。针对Flutter项目目前实践下来有三条路线第一种官方SDK 自己写平台通道。Android端用支付宝官方SDK配合MethodChanneliOS端同样操作微信端则自己封装WXApi。这套方案不依赖第三方封装SDK永远是最新版出了问题你清楚每一步在干什么可控性最强。代价是需要自己维护两端原生代码对原生开发有一定要求。第二种使用第三方聚合插件比如fluwx、tobias这类社区方案。好处是封装得比较好拉起支付、回调接收的代码量少很多适合快速上线。坏处是更新节奏完全取决于作者的热情微信和支付宝SDK一旦升级插件没跟上轻则警告重则崩溃。我见过不止一个项目因为插件长期不更新卡在旧SDK上最后为了过审或兼容新系统被迫自己改源码。第三种H5中转方案。服务端生成H5支付链接App内用WebView打开用户完成支付后通过URL Scheme或轮询回跳。这个方案对客户端来说几乎没有原生代码省事。但体验和安全性都差一档微信内H5支付还需要额外权限苹果对H5支付的内购抽成判断也容易出问题。我之前在一个内容类App里测过H5支付支付成功率比原生SDK大概低了五六个百分点用户经常卡在“正在确认支付结果”这一步。三者权衡我的建议很直接如果团队里有Android或iOS原生开发哪怕只能给一点点支援时间都应该走官方SDK封装路线。没有原生人力的话可以用优秀的第三方插件起步但一定要提前验证插件的维护活跃度和源码质量。后文我尽量把官方封装路线的细节讲透大家可以根据自身情况做裁剪。1.3 支付链路的关键环节永远别信任客户端不管是支付宝还是微信完整的支付链路永远是下面这个结构业务服务端负责创建订单、调用支付平台的下单接口、拿到支付参数客户端拿到参数后拉起支付SDK展示支付页面用户完成支付后支付平台异步通知服务端服务端回调同时把结果返回给客户端SDK客户端回调。两端回调都到了订单状态才能最终确认。这条链路里有一句至理名言客户端展示的支付结果永远只是“参考消息”绝不能作为订单状态的最终依据。原因很直白——客户端回调可以被伪造、被拦截、被篡改如果只凭客户端回调就把订单标记为已支付等于开门让黑产进来刷单。真正的订单确认必须依赖服务端接收支付平台的异步通知并完成验签后才落库。我见过一个真实的翻车案例开发者图快客户端收到成功回调就直接在本地把订单改成已支付服务端异步通知只是顺带处理。结果被人在抓包工具里伪造了成功返回白嫖了一堆虚拟商品。事后复盘时发现支付平台的服务端通知其实已经发过来了但因为客户端“先入为主”改了状态服务端明明校验失败却没人处理。所以不管你的项目多简单客户端支付结果只能用于提示用户服务端验签落库才是唯一的支付完成标志。2. 支付宝集成从开放平台到Flutter调用2.1 开放平台配置与密钥准备如果你从零开始第一步不是写代码而是去支付宝开放平台注册开发者账号、创建应用。创建的时候有一个重要的选型点移动应用和网页应用不要选错。移动应用拿到的是AppID私钥、支付能力走APP支付网页应用走的是电脑网站/手机网站支付两者的接入流程和参数格式都不相同。我们做Flutter集成选“移动应用”即可。创建成功后进入应用详情需要完成这几件事开启APP支付能力签约并拿到审核通过后的实际支付权限。沙箱环境默认可用但真实支付能力需要上传应用信息审核一般一个工作日左右。生成密钥对。支付宝现在强制要求RSA2SHA256withRSA生成时通常用支付宝官方提供的密钥生成工具会产出一对RSA密钥。私钥留在自己手里公钥上传到开放平台的“接口加签方式”里。这里有一个特别容易弄反的细节你自己生成的叫“商户应用公钥”上传到平台后平台会返回一个“支付宝公钥”。服务端验签和加签时用两个公钥——应用公钥是平台用来验证你请求的支付宝公钥是你用来验证支付宝响应的。我在代码评审时见过有人把自签公钥当支付宝公钥用程序编不过一头雾水。如果项目早期的服务端用的是老版本SDK还要留意密钥格式。支付宝的老工具和部分服务端SDK默认使用PKCS8格式的私钥正文开头带-----BEGIN PRIVATE KEY-----新工具默认也是这个。但有些语言库对PKCS1格式支持不好如果你的Java服务端从旧项目迁移私钥格式不统一会出现诡异的加签失败方法是把PKCS1转成PKCS8一行命令搞定。2.2 服务端下单与签名把orderString传回客户端支付宝APP支付的流程有一个和微信很不一样的点支付宝不要求客户端去调服务端的“统一订单接口”而是由服务端拿着订单参数拼好、加签生成一个很长的orderString实际是一串URL编码后的参数传给你的Flutter端Flutter端把这条字符串原样传给支付宝SDKSDK解析后弹出收银台。这个orderString的拼装逻辑新手很容易整不明白其实它就是把以下参数按ASCII码排序拼接后用私钥加签app_id、biz_content、charset、method、sign_type、timestamp、version等公共参数。其中biz_content是最核心的业务参数包含了out_trade_no商户订单号、total_amount金额、subject商品标题、product_code固定值QUICK_MSECURITY_PAY。以Java服务端为例伪代码大致长这样AlipayClient alipayClient new DefaultAlipayClient( https://openapi.alipay.com/gateway.do, appId, privateKey, json, UTF-8, alipayPublicKey, RSA2 ); AlipayTradeAppPayRequest request new AlipayTradeAppPayRequest(); request.setBizContent({\out_trade_no\:\ orderNo \, \total_amount\:\ amount \, \subject\:\ subject \, \product_code\:\QUICK_MSECURITY_PAY\}); request.setNotifyUrl(https://yourdomain.com/api/alipay/notify); // request.setReturnUrl(...); String orderString alipayClient.sdkExecute(request).getBody();orderString生成后客户端不需要关心里面每一段是什么含义原样透传给SDK即可。但服务端一定要记得配置notify_url这是支付宝异步通知的接收地址。很多人只配了同步返回参数发现客户端回调收到了但服务端订单一直不更新往往就是这里漏了。需要提醒的是服务端下单接口务必自己控制幂等性。用户在支付页反复进出如果每次都新生成一个订单号会导致服务端产生大量无效订单和退款纠纷。常规做法是客户端先请求业务服务端创建订单服务端同一个“预下单请求”只生成一次out_trade_no重复请求直接返回同一个订单号。2.3 Flutter端拉起支付宝并处理结果码先说我推荐的做法自己写Plugin。Android端在MainActivity里注册一个MethodChannel方法名比如payWithOrder收到orderString后调用支付宝SDK的PayTaskfinal PayTask alipay new PayTask(activity); final MapString, String result alipay.payV2(orderString, true);这里有个性能细节不要在主线程调用payV2SDK内部会做一些耗时操作放在子线程里执行完成后切回主线程返回结果。返回的是一个Map核心是resultStatus字段几个关键值的含义9000支付成功8000支付结果确认中比如用户在收银台停留太久SDK没收到明确结果6001用户中途取消6002网络连接出错4000系统异常订单状态未知6004支付结果未知同样需要以服务端查询为准我的处理方式是9000直接显示成功并调服务端确认6001提示用户已取消8000、6004、4000、6002统统不直接判失败而是弹一个“确认支付结果”的轻提示然后调服务端查询接口确定最终状态。因为这几个状态都代表“客户端不确定”但钱可能已经扣了。iOS端同样注册MethodChannel后调用支付宝SDK的payOrder:fromScheme:callback:方法。这里的fromScheme参数用于支付完成后跳回你的App需要在Info.plist里配置URL Scheme一般是alipay前缀加你的应用的标识。示例AlipaySDK.defaultService().payOrder(orderString, fromScheme: alipay2024xxxx) { result in // result[resultStatus]判断 }别小看这个URL Scheme如果配置不对支付完成后用户会停在支付宝App里回不到你的应用体验很差而且回调压根不会触发。接入时先确认Scheme和开放平台填的一致。沙箱联调也是个技巧活。支付宝提供一套完整的沙箱环境包括沙箱版支付宝App要用特殊二维码或链接下载商店里搜不到和沙箱买家账号。接入沙箱环境时注意服务端网关地址要切换到openapi.alipaydev.comAppID换成沙箱应用的同时下载沙箱钱包App才能出收银台。我自己第一次联调时忽略了沙箱钱包这个环节应用里拉起的是真实支付宝自然怎么都支付不了后来才发现付款时登录的账号必须用沙箱账号并安装沙箱版支付宝。3. 微信支付集成签名、回调与参数详解3.1 微信支付的前置条件AppID/商户号/APIv3/证书微信支付的配置链路比支付宝更长。你需要同时具备开放平台的移动应用AppID和微信支付商户平台的商户号并且两者要做过绑定关联。这条我多说一句如果你们公司只注册了微信支付商户号但开放平台没有移动应用App里的微信支付是拉不起来的。移动应用AppID是微信支付App端拉起SDK的身份凭证缺了它商户号再完好也无济于事。APIv3密钥是微信支付接口加签的核心32位字符串可以在商户平台自行设置。它是服务端请求微信支付接口、构造Authorization头时用到的对称密钥。除此之外申请商户证书会得到一个API证书包括apiclient_cert.pem和apiclient_key.pem。证书是验证商户身份的APIv3密钥是加密请求体的两者别搞混。微信支付的公钥体系这几年又多了“微信支付公钥”用于验证回调通知的签名。在比较新的API v3中回调通知的验签需要用到微信支付公钥或者平台证书。这块配置如果流程不熟悉建议直接用官方SDK的AutoUpdateCertificatesVerifier自动下载和更新微信支付公钥省掉手动管理证书的坑。3.2 统一下单六个关键参数从哪来App内唤起微信支付服务端要调用微信支付v3的/v3/pay/transactions/app接口传入appid、mchid、description、out_trade_no、notify_url、amount等信息。接口成功后返回一个json结构其中核心是prepay_id。注意这个prepay_id不能直接给客户端需要服务端用APIv3密钥生成二次签名。App拉起微信支付时需要的其实是一组参数。SDK要求的字段包括appid、partnerid、prepayid、package、noncestr、timestamp、sign。其中sign的计算方式是把appid、timestamp、noncestr、prepayid这几个参数拼接成字符串后用商户私钥签名。拼装签名这一步是所有微信支付集成中我最想强调的点十次错误里有八次出在这里String message appid \n timestamp \n nonceStr \n prepayId \n; // 注意此处末尾还有一个换行符。 Signature signature Signature.getInstance(SHA256withRSA); signature.initSign(privateKey); signature.update(message.getBytes(StandardCharsets.UTF_8)); byte[] signBytes signature.sign();拼错的地方常见有三种一是多个\n漏了尤其最后一个换行二是把参数顺序换了微信要求appid、timestamp、noncestr、prepayid这个顺序不能乱三是直接用私钥对参数做了URL编码再来签名其实必须是原始字符串。这种错误在服务端代码里非常隐蔽因为单独看每一段代码都对拼起来就是报“签名错误”。排查时我一般建议先打印出待签名串用工具独立验签几秒就能定位。3.3 Flutter端拉起微信与onResp回调处理微信SDK跟支付宝的区别在于支付宝是SDK内部直接弹出收银台微信是调起另一个App微信客户端来完成支付所以接入时的关键配置多了一项需要在AndroidManifest.xml里声明一个用于接收微信回调的Activity同时微信SDK要求的WXEntryActivity路径固定为.wxapi.WXEntryActivity不能改。Android端调起微信的代码如下// 先注册到微信 IWXAPI api WXAPIFactory.createWXAPI(context, APP_ID, true); api.registerApp(APP_ID); // 构建支付请求 PayReq req new PayReq(); req.appId APP_ID; req.partnerId partnerId; req.prepayId prepayId; req.packageValue SignWXPay; req.nonceStr nonceStr; req.timeStamp timestamp; req.sign sign; api.sendReq(req);构建PayReq时最容易出错的是req.sign很多人把packageValue和sign弄混或者把服务端返回的sign设置成了package导致微信客户端一直提示参数错误。另外sendReq返回的是一个布尔值如果App没装微信SDK内部会尝试跳转H5但H5需要单独配置支付域名否则会失败。这里建议自己测一下未安装微信的场景别等到线上才暴露。调用之后结果通过BaseReq和BaseResp回调给WXEntryActivity由它转发给Flutter端。我惯用的方式是在WXEntryActivity里拿到onResp后通过EventChannel或MethodChannel把结果传给Dart层。回调代码大致是这样的Override public void onResp(BaseResp resp) { if (resp.getType() ConstantsAPI.COMMAND_PAY) { int code resp.errCode; // 0表示成功-2表示用户取消其他错误码参考SDK文档 methodChannel.invokeMethod(onPayResult, code); } }iOS端则要在AppDelegate的handleOpenURL或onOpenURL方法里把微信的回调转发给SDKWXApi.handleOpen(url, delegate: self)然后实现WXApiDelegate的onResp同样把errCode转出去。这里需要注意iOS 9之后的Universal Links支持。微信SDK要求配置Universal Links才能在微信客户端回调时回到App否则可能收不到回调。这个配置包括在苹果开发者后台开启Associated Domains并且上传一个apple-app-site-association文件到你的域名根目录。坑的是这个文件必须能被公网访问且不能经过重定向有些CDN配置会自动跳转导致微信无法读取。4. 全平台适配Android/iOS/鸿蒙/Web的差异点4.1 Android包名、签名、混淆规则一个不能少Android接支付最容易被忽视的是包名一致性。微信SDK要求你的应用的包名必须和开放平台填写的包名完全一致且签名keystore指纹也必须一致。如果你Debug包和Release包使用了不同的签名那么微信支付在Debug模式下永远会提示“应用未注册”。这一点在团队开发时特别容易坑人因为工程师的Debug签名跟公司Release签名是两套。支付宝对包名相对宽松但应用签名仍然影响大。支付宝的RSA2验签是通过服务端完成的客户端的应用签名主要用于SDK的安全校验不一致时通常表现为交易风险控制报错。另外支付宝SDK和微信SDK都要求你的App里不能混淆SDK自身的类。在proguard-rules.pro里要加上对应keep规则。微信的典型混淆配置-keep class com.tencent.mm.opensdk.** { *; } -keep class com.tencent.wxop.** { *; }支付宝的典型混淆配置-keep class com.alipay.android.phone.mrpc.core.** { *; } -keep class com.alipay.sdk.** { *; }不配混淆规则一般是能编译过的但运行时容易出“在哪个类里找不到方法”的异常排查起来很痛苦。我在一个着急上线的小程序关联项目里亲眼见过研发为了图快没加混淆配置结果支付宝SDK在release包直接静默失败后来一行一行排查才定位到是混淆把SDK内部类给处理了。Android还有另一个和支付强相关的点通知栏权限。微信支付拉起收银台后如果微信本身的通知栏权限被各种“清理大师”禁掉了部分低端机型上会出现支付结果正常但回调响应很慢的情况。虽然严格说这不是代码问题但我在适配测试中遇到的比例并不低值得记录下来。4.2 iOSURL Scheme与Universal Links配置iOS端的配置主要是两块Info.plist里的LSApplicationQueriesSchemes以及Scheme本身。支付宝在Info.plist里需要声明一项alipay开头的URL Scheme按开放平台分配的“URL Scheme”填并且要在LSApplicationQueriesSchemes里加上该Scheme否则canOpenURL判断会失败影响SDK的跳转判断。微信则通常要求配置weixin和weixinuls部分旧版本还需要weixinULAPI。keyLSApplicationQueriesSchemes/key array stringalipay/string stringweixin/string stringweixinuls/string /array如果你不用Universal Links而是纯URL Scheme方式接微信回调那AppDelegate里对wx开头的URL调用handleOpen。但现在微信推荐的是Universal Links一旦配置了Universal Links但没配置正确反而会导致回调双重处理甚至回调不过去。我的经验是要么只用URL Scheme要么就把Universal Links全链路配置好别两个都开像开盲盒一样测试。Web端的话支付宝有专门的支付宝H5支付能力微信也有H5支付需要单独申请支付域名。Flutter Web上做支付通常是跳转一个由服务端生成的收银台链接用户在浏览器里完成支付后通过重定向或前端轮询确认结果。好处是免去了移动端原生配置坏处是Flutter Web的页面生命周期与URL变化处理比较别扭建议直接用url_strategy和路由拦截处理回跳而不是依赖dart:html的旧API。4.3 鸿蒙与未来平台适配鸿蒙化是这两年很多金融、政企项目必须考虑的方向。支付宝已经明确支持鸿蒙NEXT的SDK微信也在逐步完善。但目前Flutter在鸿蒙上的运行时还是需要靠Flutter的OpenHarmony鸿蒙适配工程来支持。也就是说除了标准的Android/iOS端如果要跑在鸿蒙上得额外做一次平台通道的鸿蒙实现。这块和传统Flutter插件的适配思路一样Plugin的默认实现包括Android和iOS鸿蒙侧需要单独对接HarmonyOS版本的SDK并把API封装成Flutter侧一致的MethodChannel接口。如果项目只是“能跑就行”的阶段可以先在鸿蒙上禁用支付入口用H5或扫码兜底。但如果甲方明确要求原生支付那就需要审查支付SDK的鸿蒙版本能力和Flutter还在演进中的鸿蒙支持成熟度再排期。就我目前接触到的信息鸿蒙侧支付宝支付主流程已经打通微信还处于逐步灰度阶段不建议在关键业务里做先锋测试。5. 常见问题排查与避坑实录5.1 签名错误类微信“用户态签名signature错误”到底怎么解这个标题组合几乎每个做微信支付的都被搜索引擎带到过。我以亲身实战告诉你消息里的“用户态签名”和你服务端做签名不是一回事也不要在服务端签名代码里找问题。用户态签名signature错误通常是客户端调用微信SDK时传入的sign字段不对或者传给SDK的appid和当前应用不匹配。排查顺序应该是第一打印出客户端收到的sign和api.sendReq之前的字段做比对。确认服务端返回的sign没有被URL编码过。有些服务端框架会自动encode导致变成了%2B进了微信就是必现的签名错误。第二确认req.appId和开放平台创建移动应用时的AppID完全一致注意大小写。第三核实req.partnerId是商户号而不是AppID。第四检查req.timeStamp微信要求秒级时间戳如果你用了毫秒级偶尔能支付成功但大概率报签名不一致。我知道的就有项目偷偷用了13位毫秒戳线上支付失败率很高查了很久定位不到。另外如果所有配置都是对的但错误仍然复现还有一个小概率点服务端签名用的私钥和商户平台API安全里下载的证书私钥不匹配。一些人为了省事复制了别人的商户证书看似能初始化SDK但签名就是错的。重签并配置匹配的证书后问题马上消失。5.2 回调丢失类收不到支付结果该用什么兜底客户端收不到回调最常见的有三种一是URL Scheme没配置好。支付宝的Scheme填得不对支付完成就悬停在支付宝App里微信的Universal Links如果失效微信App无法跳回来。这两种的修复都是配置层面的按前面章节核对一遍。二是Android上WXEntryActivity路径不对。微信要求这个类必须放在包名下.wxapi包中而且Manifest里不能给他加exportedfalse。如果被某些“性能优化工具”修改了回调直接断掉。三是用户切换后台太久SDK回调被系统回收。iOS上如果App被系统杀掉回调必须等用户再次打开App才会补发但微信SDK本身在冷启动后可能不自动再次触发onResp。这时候客户端能做的很有限真正的兜底应该放在服务端客户端支付后主动调用一次服务端的订单查询接口或者服务端根据支付平台的异步通知再推送给客户端刷新状态。我个人建议无论客户端回调成功还是失败支付完成后都应触发一次服务端订单查询。这个查询是幂等的成本极低却能解决绝大多数“回调丢了”导致的订单状态不同步问题。有的团队甚至直接用这套替代客户端回调作为唯一确认方式也是可行的。5.3 构建与环境中容易忽略的坑Flutter的构建环境中有不少问题是搜索引擎热门词里的“常客”。比如you are applying flutters main gradle plugin imperatively using the apply这个通常是项目里的根build.gradle或app/build.gradle写法和新版Flutter框架不兼容。升级Flutter之后需要把插件声明方式改成plug apply的新风格而不是旧式apply script。同样还有“current configured flutter sdk is not known to be fully supported”这个一般是Flutter版本和小版本不匹配导致的解决办法很朴实——把Flutter升级到稳定版或者干脆锁住项目固定的Flutter版本别轻易跨版本升级。还有像Xcode 27或新版Xcode导致老Flutter包编译报版本低的问题本质上是iOS原生依赖的兼容性问题。应对思路是在升级Xcode前先把Flutter和所有插件升级到兼容版本顺序反过来的话会浪费大量时间在CocoaPods编译报错上。另外EventChannel在支付场景里的应用值得提一嘴。如果服务端需要异步推支付结果到客户端比如用户在支付完成后服务端做了风控需要延迟确认EventChannel是Flutter侧接原生事件流的正路。这里我吃过一个暗亏在Dart层用MethodChannel轮询没问题但EventChannel是连续流对象记得在页面销毁时取消订阅避免原生层持续往已销毁的页面发送事件导致内存抖动甚至崩溃。5.4 其他“技术外”的坑多渠道打包与测试环境最后再说两个不太被技术文档覆盖的点。一是多渠道打包。如果你的App分渠道签名或者分渠道有不同的AppID比如国内版和国际版那支付配置必须跟着渠道走。签名不一致在微信支付上会直接无法调起AppID不一致在回调时可能串号。建议做一套“渠道配置”集中管理别让支付配置分散在多个gradle配置里。二是测试环境的隔离。支付宝沙箱环境有自己的AppID、私钥和网关微信虽然没有真正意义上的沙箱但有“模拟器支付”能力供调试但模拟器支付和真实支付在某些机型上行为并不完全一致。最好的做法是测试环境全部用真实小订单配合退款进行钱也不多问题能暴露得更真实。我见过很多团队过度依赖沙箱或模拟器上线后才发现真实环境里手机厂商ROM拦截SDK跳转、输入法挡住密码框之类的问题上线当天救火。写在最后的个人体会支付集成这件事技术上并不难难度主要来自三方面第一是链路长客户端、服务端、支付平台三方各自有状态第二是回调弱客户端回调不是可信依据服务端异步通知又可能延迟第三是原生配置杂证书、Scheme、签名、包名漏一个就出幺蛾子。我自己做支付集成时习惯先把两条链路的架构图画清楚再动手。客户端拉起支付服务端接收异步通知客户端回调仅用于交互提示服务端查询兜底做最终确认。这套框架定下来无论接支付宝还是微信或者以后扩展到银联、Apple Pay代码结构都不用重改。再分享一个实际体会支付代码最怕“看起来能跑”。支付集成没有“能跑就算成功”的说法用户取消、网络超时、服务端通知延迟、杀进程后冷启动每个异常场景都要主动造出来测一遍。你多测一个异常分支线上就少一批工单。这篇文章不能保证你的支付一定顺利但至少希望你在踩到这些坑时能有一个大致的排查方向。祝大家集成顺利。
返回列表