18910140161

iOS集成H5微信支付实现跳转与回调的解决方案

顺晟科技

2021-06-16 10:40:02

251

最近有要求支付宝和微信的App支付SDK不能集成在iOS客户端(为了防止苹果对SDK进行审计和测试),所以使用了H5支付。虽然微信和支付宝的H5支付文件都说不要在App里用H5支付,而要用App支付,但是总有办法的。

这篇文章是关于H5微信支付如何从App跳转到微信,以及如何从微信跳转回App。支付宝见此文:

IOS整合支付宝H5支付实现跳转和回调解决方案

效果是:App微信支付(成功失败或取消)App

介词准备

本项目使用WKWebView,预动作是后端合作伙伴处理完微信H5支付订单链接,客户收到订单链接后的操作。

订单链接为微信支付单-统一订单API返回的mweb_url,格式为https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?预付费_ id=wx 2016121516420242444321 ca 0631331346 package=1405458241。

操作程序

1.添加网址方案并将微信添加到白名单

添加网址方案。在xcodeproj文件的信息选项卡底部的网址类型中设置。注意此URL的一级域名需要与微信商户后台设置的一级域名一致(微信商户平台-产品中心-开发配置-H5支付)。例如,如果微信商户中设置了oicqzone.com,那么网址方案可以设置为a1.oicqzone.com。该功能使一套H5支付系统能够轻松集成到多个应用程序中。如果只有一个App需要H5付费,也可以直接填写与微信后台一致的oicqzone.com。

2019年4月10日更新

如果你按上图所示填写www.oicqzone.com,网址方案只能设置为其三级域名,如a2.www.oicqzone.com或同一个www.oicqzone.com

将微信的URL Scheme微信和微信添加到项目白名单中。在xcodeproj文件的“信息”选项卡中的“自定义iOS目标属性”的lsapplicationqueriecodes中添加上述两个字符串,如果没有lsapplicationqueriecodes,类型为Array,则手工输入并添加。

2.WKWebView加载链接

添加协议WKNavigationDelegate和WKUIDelegate。

创建一个WKWebView并加载统一订单链接。

- (void)buildWKWebView {

WKWebView * webView=[[WKWebView alloc]initwithframe : cgrectmake(0,NAV_HEIGHT,SCREEN_WIDTH,SCREEN _ HEIGHT-NAV _ HEIGHT)];

[self . view addsubview : WebView];

webview . navigationdelegate=self;

webView。UIDelegate=self

NSURL * pay URl=[NSURL URltering : self . pay string];

nsmutable rlrequest * request=[nsmutable rlrequest with URL : pay URL];

[request setvalue : @ ' a1 . oicqzone.com ://wxpaycallback/' for Httpheaderfield : @ ' Referer '];

[WebView LoadRequest : request];

}

这里self.payString是微信H5支付后台的统一订单链接,格式为https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?预付费_ id=wx 2016121516420242444321 ca 0631331346 package=1405458041。

我们需要做的是根据文档向这个请求添加一个请求头Referer。关键是这个a 1 . oicqzone.com ://wxpaycallback/不仅满足了微信检测到后台有商家设置的一级域名的要求,还把这个链接做成一个URL Scheme,这样跳转到微信客户端后就能顺利跳回自己的App(无论支付成功与否)。其中主机wxpaycallback/可以任意设置,方便在AppDelegate中跳回后部署业务逻辑。当然,如果你不需要在AppDelegate中接收动作,而是跳回支付界面进行后续处理,那么你只能在URL schema 1 . oicqzone.com ://设置为上一步。

2019年4月10日更新

经过测试,对于应用中的H5支付,实际上是按照以下步骤进行的

@ ' https://wx . tenpay.com/CGI-bin/mmpayweb-bin/check mweb '

以下参数redirect_url起着付款后跳回App的作用,Referer只起着验证微信的作用。

因此,推荐人只需设置为微信H5支付注册域名的子域,如

[request setvalue : @ ' a1 . oicqzone.com ' for HttpHeaderfield : @ ' Referer '];

3.实施代理方法拦截链接,跳转到微信

-(请参阅)webview 3330(wkwebview *)webview决策策略导航动作3330(wknavigation动作*)导航动作决策处理器3330(请参阅(^)(wknavigation行动政策))决策处理人[

nsr请求*请求=导航操作。请求:

nsstring *estring=[导航操作。请求。URL。byrnemovingpercomputercoded]的estring字符串;

//HuWKWebView哎哎哎哎哎哎哎哎哎哎哎哎哎哎哎哎,是吗重定向全球资源定位器(Uniform Resource Locator)哎哎哎哎哎哎哎哎哎App(应用程序)什么事网址方案(网址方案)

if([运算hasprefix 3330 @ ' 339 wx。10天。com/CGI-bin/mmpayweb-bin/check mwebb]![estring hassifix 3330[nsstring stringwith format 3330 @]重定向_ URL=a1。oicqzone。com 3330//wxppaycallback/']]]

决定处理程式(wknavigation操作策略取消);

nsstring *重定向Url=零:

如果([包含3360 @ '重定向_ URL='])]

结构体重定向范围=[发情范围字符串: @ ' reroute _ URL '];

重定向URL=[[提取substringthindex 3330重定向范围。location]stringbypending ring 3330[n string with format 3330 @]重定向_ URL=a1。oicqzone。com 3330//wx pay callback/'];

} else

重定向URL=[estring stringbypending ring 3330[nstring stringwith format 3330 @]重定向_ URL=a1。奥奇松。com 3330//wxppaycallback/'];

}

nsmutualurlrequest * new request=[nsmualurlrequest with URL 3330[NSRL URL 3330重定向URL]cache policy 3330n ourrequestprotocachepolicy timerouterval :];

新请求。所有httpheader字段=请求。所有http标头字段:

newRequest(新请求)。网址=[NSRL网址3330重定向URL];

[web view load request : new request];

返回;

}

//阿云娥阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜统一资源定位器方案,拜占庭(拜占庭)

if([运算hasprefix 3330 @ ' weixin 3330/'])

决定处理程式(WKNavigationActionPolicyAllow):

dispatch _ time(dispatch _ time _ now,(int64 _ t)(0.5 * nsec_per_sec)),dispatch_get_main_queue(),^

if[[[ui应用程序共享应用程序]CANopen URL 3330导航动作。请求。URL]]

[[ui应用程序共享应用程序]openurl 3330导航操作。请求。URL];

} else

//绿筠小姐,伊贺盛瑞

}

});

返回;

}

决定处理程式(WKNavigationActionPolicyAllow):

返回;

}

4.AppDelegate(应用程式委派)杨俊钦先生

朱庇特?朱庇特AppDelegate(应用程式委派)朱庇特阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹,朱庇特朱庇特朱庇特阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹,菲兰达菲兰达。

云姐AppDelegate(应用程式委派)阿叔阿叔阿叔阿叔阿叔阿叔阿叔。

-(bool)application 3330(ui application *)app open URL 3330(ns dictionary *)URL选项3330(nsdictionary string *、id *)选项.]

//safepay1590年H5型拜占庭(英国)主机(主机)

if([URL。host isequaltostring 3330 @ ' wxppaycallback ']| |[URL。host isequaltostring 3330 @ ' safe pay ']])

//范仲淹,范仲淹,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,popView哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟

uitabarccontroller * tabbarvc=(uitabarccontroller *)toprootcview controller;

ui导航控制器* navvc=tabbarvc。查看控件[tabbarvc。selectediindex];

[nav VC pop view control randdomain ed : yes];

nsstring * order id=[[nsser defaults默认值]object forkey 3330 @ ' payorder id "];

nsstring * pay fee=[[nsser defaults默认值]object forkey : @ ' pay fee];

//朱塞佩阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹

ns dictionary * result=@ { @ { @ ' order _ id ' 3330 order id,@ '收款人' 3330收款人};

[[nsnotification center default center]post notification name 3330 @ ' html paynotification ' object 3330 self userid 3330 results];

}

}

5.云娥H5型王敬希

2019-什么4-你好10奇金哥

贺盛文何如,阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金2019-什么4-你好,范思哲范思哲范思哲

吴经盛(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生),云娥与云娥同在

我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊oicqzone。com,喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂App(应用程序)僧曰,云娥H5型拜占庭王5鲁仲文鲁仲文。你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看www . oicqzone.com-你好-你好a1.www.oicqzone.com网站

云娥H5型拜占庭鲁登庭鲁登庭cqzone.com上阿云,朱庇特阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹

阿皮亚波塔-a1-a2

王世忠(英国)参考文献oiqzone .吃1 .贝塔。oicqzone .吃2 .贝塔。oiqzone。com .com gamma。oiqzone。com

阿云重定向_ URL alpha。oiqzone。com 3330//选项一。贝塔。oiqzone。com 3330//a2。贝塔。oiqzone。com 3330//option algoma。oiqzone。com 3330//

schemealpha。oicqzone。昏迷输入1 .贝塔。oicqzone。昏迷输入2 .贝塔。oiqzone。com gamma。oiqzone。com

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航