微信
2018-03-28 本文已影响50人
edison0428
微信支付demo
但是现在下来,运行报错
7A6E5B4D93DEE06188BCDC4F60BBBD5C.jpg
解决方案:添加库 CFNetwork.framework libc++.tbd
然后运行,进入app就奔溃
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM enqueue:]: unrecognized selector sent to instance 0x60000024ef40'
在buddle Seeting 里面的Other Linker Flags 中添加-ObjC就可以了。
但是点击发起微信支付
返回的是支付失败,不管它了,主要看代码就行
微信支付业务流程
chapter8_3_1.png商户系统和微信支付系统主要交互说明:
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】
步骤5:商户后台接收支付通知。api参见【支付结果通知API】
步骤6:商户后台查询支付结果。,api参见【查询订单API】
开始操作
前期准备
1 pod 接入
pod 'WechatOpenSDK'
sdk里包含了微信登陆,微信分享,微信支付
2 设置URL type
添加 URL schme
image.png
3 添加白名单
image.png4重写AppDelegate 的handleOpenURL 和openURL方法
image.png// NOTE: 9.0以前使用新API接口
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
[self.window makeToast:@"订单支付成功"];
[self updateVIPAccess];
}];
return YES;
}else if ([url.host isEqualToString:@"pay"] || [url.host isEqualToString:@"oauth"] || [sourceApplication isEqualToString:@"com.apple.MobileSMS"]) {
//微信支付,登陆
return [WXApi handleOpenURL:url delegate:[EYWXLogin sharedManager]];
}else if ([url.host isEqualToString:@"platformId=wechat"]) {
//微信分享
return [WXApi handleOpenURL:url delegate:[EYWXLogin sharedManager]];
}
else if([url.host isEqualToString:@"qzapp"]){
//QQ登录
return [TencentOAuth HandleOpenURL:url];
}else if ([url.host isEqualToString:@"response_from_qq"]) {
//QQ分享
[QQApiInterface handleOpenURL:url delegate:self];
return [TencentOAuth HandleOpenURL:url];
}
return YES;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
if ([resultDic[@"resultStatus"] intValue] == 9000) {
NSLog(@"%@",resultDic);
[self.window makeToast:@"订单支付成功"];
[self updateVIPAccess];
}else{
NSLog(@"%@",resultDic);
[self.window makeToast:resultDic[@"memo"]];
}
}];
return YES;
}else if ([url.host isEqualToString:@"pay"] || [url.host isEqualToString:@"oauth"] || [[options objectForKey:UIApplicationOpenURLOptionsSourceApplicationKey] isEqualToString:@"com.apple.MobileSMS"]) {
//微信支付,登陆
return [WXApi handleOpenURL:url delegate:[EYWXLogin sharedManager]];
}else if ([url.host isEqualToString:@"platformId=wechat"]) {
//微信分享
return [WXApi handleOpenURL:url delegate:[EYWXLogin sharedManager]];
}
else if([url.host isEqualToString:@"qzapp"]){
//QQ登录
return [TencentOAuth HandleOpenURL:url];
}else if ([url.host isEqualToString:@"response_from_qq"]) {
//QQ分享
[QQApiInterface handleOpenURL:url delegate:self];
return [TencentOAuth HandleOpenURL:url];
}
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
if ([url.host isEqualToString:@"response_from_qq"]) {
//QQ分享
[QQApiInterface handleOpenURL:url delegate:self];
return [TencentOAuth HandleOpenURL:url];
}else if([url.host isEqualToString:@"qzapp"]){
//QQ登录
return [TencentOAuth HandleOpenURL:url];
}
else {
//return NO;
return [WXApi handleOpenURL:url delegate:[EYWXLogin sharedManager]];
}
}
功能代码
1注册微信
BOOL res = [WXApi registerApp:kWXAppConfigWeChatAppId];
2实现WXApiDelegate协议两个方法
-(void) onReq:(BaseReq*)req
-(void) onResp:(BaseResp*)resp
如果你的程序要发消息给微信,那么需要调用WXApi
里的sendReq
函数
2先实现上述回调方法,包含微信登陆 微信分享 微信支付所有功能的回调
#pragma mark - WXApiDelegate
-(void) onReq:(BaseReq*)req{
}
-(void) onResp:(BaseResp*)resp{
if([resp isKindOfClass:[SendAuthResp class]]) {
SendAuthResp* authResp = (SendAuthResp*)resp;
/* Prevent Cross Site Request Forgery */
NSLog(@"autoResp state:%@ errcode:%d",authResp.state,resp.errCode);
switch (resp.errCode) {
case WXSuccess:{
NSLog(@"RESP:code:%@,state:%@\n", authResp.code, authResp.state);
!_resultBlock?:_resultBlock(WXLoginResultTypeSuccess);
NSLog(@"微信登陆成功");
#pragma mark 可获取用户信息 ,但是secret我拿不到 官网文档有详细的介绍
}
break;
case WXErrCodeAuthDeny:
!_resultBlock?:_resultBlock(WXLoginResultTypeAuthDeny);
NSLog(@"微信登录授权失败");
break;
case WXErrCodeUserCancel:
NSLog(@"微信登录用户取消");
!_resultBlock?:_resultBlock(WXLoginResultTypeCancel);
default:
break;
}
}
else if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
NSLog(@"分享后 --- %d %@ %d", resp.errCode, resp.errStr, resp.type);
if(resp.errCode==0){ // 分享成功
NSLog(@"分享成功");
//[[NSNotificationCenter defaultCenter] postNotificationName:@"thirdShare" object:nil userInfo:@{@"isSuccess":@"1"}];
}else {
NSLog(@"分享失败");
//[[NSNotificationCenter defaultCenter] postNotificationName:@"thirdShare" object:nil userInfo:@{@"isSuccess":@"0"}];
}
}
else if([resp isKindOfClass:[PayResp class]]){
switch (resp.errCode) {
case WXSuccess:
//当这里收到支付成功时,一定要请求服务器查询是否支付成功,不要以客户端的返回作为结果判定
NSLog(@"支付成功");
!_payResultBlock?:_payResultBlock(WXPayResultTypeSuccess);
break;
case WXErrCodeUserCancel:
NSLog(@"支付前用户手动取消");
!_payResultBlock?:_payResultBlock(WXPayResultTypeCancel);
break;
default:
!_payResultBlock?:_payResultBlock(WXPayResultTypeFailure);
break;
}
}
}
微信支付
/**
微信支付
@param params 参数 商品id 商品数量
*/
-(void)weChatPay:(NSDictionary *)params result:(WXPayResultBlock)payResBlock{
_payResultBlock = payResBlock;
if (![WXApi isWXAppInstalled]) {
!_payResultBlock?:_payResultBlock(WXPayResultTypeUnstalled);
return;
}
//第一步 用户已经选好商品并且选择的是微信支付
//第二部 app将用户选择的信息发送给后台 后台收到用户支付单,调用微信支付统一下单接口
[ILNetworking postEncryptAndDecryptResponse:@"WeChatPayOrderURL" params:params success:^(ILApiResult *apiResult) {
//第三部 后台统一下单接口返回正常的prepay_id 按照签名规范重新生成签名 ,将数据传输给app
NSLog(@"后台统一下单后返回的信息:%@",(NSDictionary *)apiResult.result);
if(apiResult.isSuccess){
if(apiResult.result){
NSDictionary * result = (NSDictionary *)apiResult.result;
PayReq * req =[[PayReq alloc] init];
req.openID = [result objectForKey:@"appid"];
req.nonceStr = [result objectForKey:@"noncestr"];
req.package = [result objectForKey:@"package"];
req.partnerId = [result objectForKey:@"partnerid"];
req.prepayId = [result objectForKey:@"prepayid"];
req.sign = [result objectForKey:@"sign"];
req.timeStamp = [[result objectForKey:@"timestamp"] intValue];
[WXApi sendReq:req];
}
else{
NSLog(@"获取订单失败");
!_payResultBlock?:_payResultBlock(WXPayResultTypeFailure);
}
}
else{
NSLog(@"获取订单错误信息;%@",apiResult.msg);
!_payResultBlock?:_payResultBlock(WXPayResultTypeFailure);
}
} failure:^(NSError *error) {
NSLog(@"微信支付网络出现问题");
!_payResultBlock?:_payResultBlock(WXPayResultTypeFailure);
}];
}
微信登陆
/**
微信登陆
@param viewController 登陆界面的控制器
@param resultBlock 登陆结果的回调
*/
-(void)loginWithViewController:(UIViewController*)viewController resultCallBack:(WXLoginResultBlock) resultBlock{
_resultBlock = resultBlock;
if (![WXApi isWXAppInstalled]) {
!_resultBlock?:_resultBlock(WXLoginResultTypeUnstalled);
return;
}
SendAuthReq *req = [[SendAuthReq alloc] init];
req.scope = wxScope;
req.state = wxState;
[WXApi sendAuthReq:req viewController:viewController delegate:self];
}
微信分享 没有封装 可分享至好友 朋友圈 收藏
/**
分享纯文字
@param textString 文字
*/
+(void)wxSharetextMessage:(NSString*)textString{
SendMessageToWXReq * req = [[SendMessageToWXReq alloc] init];
req.text = textString;
req.bText = YES;
req.scene = WXSceneSession;
[WXApi sendReq:req];
}
/**
分享图片
@param image 图片
@param thumbImage 缩略图
*/
+(void)wxShareImageMessage:(UIImage *)image thumbImage:(UIImage *)thumbImage{
WXMediaMessage *message = [WXMediaMessage message];
// 设置消息缩略图的方法
[message setThumbImage:thumbImage];
// 多媒体消息中包含的图片数据对象
WXImageObject *imageObject = [WXImageObject object];
//UIImage *image = [UIImage imageNamed:@"要分享的图片名"];
// 图片真实数据内容
NSData *data = UIImagePNGRepresentation(image);
imageObject.imageData = data;
// 多媒体数据对象,可以为WXImageObject,WXMusicObject,WXVideoObject,WXWebpageObject等。
message.mediaObject = imageObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;// 分享到朋友圈
[WXApi sendReq:req];
}
/**
分享音乐
@param musicUrl 音乐的路径
@param thumbImage 缩略图
*/
+(void)wxShareMusicMessage:(NSString *)musicUrl thumbImage:(UIImage *)thumbImage{
SendMessageToWXReq *req1 = [[SendMessageToWXReq alloc]init];
// 是否是文档
req1.bText = NO;
// WXSceneSession = 0, /**< 聊天界面 */
// WXSceneTimeline = 1, /**< 朋友圈 */
// WXSceneFavorite = 2,
req1.scene = WXSceneSession;
//创建分享内容对象
WXMediaMessage *urlMessage = [WXMediaMessage message];
urlMessage.title = @"分享一首歌";//分享标题
urlMessage.description = @"一首小歌,放松一下";//分享描述
[urlMessage setThumbImage:thumbImage];//分享图片,使用SDK的setThumbImage方法可压缩图片大小
//创建多媒体对象
NSString *kLinkURL = musicUrl;//@"http://bd.kuwo.cn/yinyue/718535?from=baidu";
WXMusicObject *music = [WXMusicObject object];
music.musicUrl = kLinkURL;//分享链接
//完成发送对象实例
urlMessage.mediaObject = music;
req1.message = urlMessage;
//发送分享信息
[WXApi sendReq:req1];
}
/**
分享视频
@param videoUrl 视频的路径
@param thumbImage 缩略图
*/
+(void)wxShareVideoMessage:(NSString *)videoUrl thumbImage:(UIImage *)thumbImage{
SendMessageToWXReq *req1 = [[SendMessageToWXReq alloc]init];
// 是否是文档
req1.bText = NO;
// WXSceneSession = 0, /**< 聊天界面 */
// WXSceneTimeline = 1, /**< 朋友圈 */
// WXSceneFavorite = 2,
req1.scene = 0;
//创建分享内容对象
WXMediaMessage *urlMessage = [WXMediaMessage message];
urlMessage.title = @"分享视频";//分享标题
urlMessage.description = @"小视频";//分享描述
[urlMessage setThumbImage:thumbImage];//分享图片,使用SDK的setThumbImage方法可压缩图片大小
//创建多媒体对象
NSString *kLinkURL = videoUrl;
WXVideoObject *video = [WXVideoObject object];
video.videoUrl = kLinkURL;//分享链接
//完成发送对象实例
urlMessage.mediaObject = video;
req1.message = urlMessage;
//发送分享信息
[WXApi sendReq:req1];
}
/**
分享链接
@param linkUrl 链接
@param thumbImage 缩略图
*/
+(void)wxShareLinkMessage:(NSString *)linkUrl thumbImage:(UIImage *)thumbImage{
NSString *kLinkURL = linkUrl;//
static NSString *kLinkTitle = @"我简书的主页";
static NSString *kLinkDescription = @"里面是一些自己总结的小知识点";
SendMessageToWXReq *req1 = [[SendMessageToWXReq alloc]init];
// 是否是文档
req1.bText = NO;
// WXSceneSession = 0, /**< 聊天界面 */
// WXSceneTimeline = 1, /**< 朋友圈 */
// WXSceneFavorite = 2,
req1.scene = WXSceneSession;
//创建分享内容对象
WXMediaMessage *urlMessage = [WXMediaMessage message];
urlMessage.title = kLinkTitle;//分享标题
urlMessage.description = kLinkDescription;//分享描述
[urlMessage setThumbImage:thumbImage];//分享图片,使用SDK的setThumbImage方法可压缩图片大小
//创建多媒体对象
WXWebpageObject *webObj = [WXWebpageObject object];
webObj.webpageUrl = kLinkURL;//分享链接
//完成发送对象实例
urlMessage.mediaObject = webObj;
req1.message = urlMessage;
//发送分享信息
[WXApi sendReq:req1];
}