前面写了2篇关于支付宝、微信支付后的传值问题,这个主要是关于支付宝、微信支付(成功或失败等传值给web页H5)。
这里用是的苹果原生和JS的交互 、有不明白JavaScriptCore框架的可以去网上搜索下这方面的资料很多
废话不多说直接上代码
@protocol JSContextDelegate <JSExport>
//这里面写H5,也就是网页端定义的方法
- (void)isLogin;//如判断用户有没有登录
@end
@interface HtmlShopingViewController ()< JSContextDelegate>
@property (nonatomic, strong) UIWebView *mainWebView;
@property (nonatomic, strong) JSContext *jsContext;
//支付宝返回的状态码
@property (nonatomic ,strong)NSString * alipayCode;
//微信返回的状态码
@property (nonatomic ,strong)NSString * wxCode;
//点击系统左上角的返回app的状态码,这里随便给一个值,前提是你和H5端商量好的值
@property (nonatomic, strong) NSString *backCode
@end
- (void)viewDidLoad {
[super viewDidLoad];
self.alipayCode = @"";//给初始值
self.wxCode = @"";//给初始值
self.backCode = @"";//给初始值
}
接着在webview的代理方法中写
- (void)webViewDidFinishLoad:(UIWebView *)webView{
self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.jsContext[@"填H5端的方法名(如abc. 方法名,取abc)"] = self;
//也就是填的 self.jsContext[@"abc"]
self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
context.exception = exceptionValue;
NSLog(@"异常信息:%@", exceptionValue);
};
if (![self.alipayCode isEqualToString:@""]) {//表示有值
NSString *alipayCodeJS=[NSString stringWithFormat:@"h5端的方法名('%@')",self.alipayCode]; //准备执行的js代码
[self.jsContext evaluateScript: alipayCodeJS];//通过oc方法调用js的alert
self.alipayCode = @""; //给回空值
}
}
微信的和系统返回键的值同理、这里就只写支付宝 怎么传值可以参考http://www.jianshu.com/p/2536a7d689a5
#pragma mark - 支付宝支付后接收的值(状态码)
- (void)aliPayReslut:(NSNotification *)notfication {
self.alipayCode = notfication.userInfo[@"resultStatus"];//支付宝的传回来的值
[self.mainWebView reload];//刷新WebView
}
支付宝在传值的时候需要注意一下
上面的是在手机上安装了支付宝客户端,没有安装客户端的情况就需要在支付宝在没有客户端的时候传回状态码的地方调用
//此方法只在没有支付宝客户端的时候传支付的状态码
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
self.alipayCode = resultDic[@"resultStatus"];
[self.mainWebView reload];
}];
最后在写一个在支付过程中直接点击左上角的返回App的处理
当点击左上角返回App的时候回调用AppDelegate.h用的这个方法
- (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
[[NSNotificationCenter defaultCenter]postNotificationName:@"resumeBack" object:nil userInfo:nil];
}
上面同和支付宝一样的传值给H5端,进行界面跳转处理。OK写到这里就搞定了支付宝、微信回调传值给H5网页,写的不好莫怪。