2018-07-03 09:52:01 u014084081 阅读数 59

iOS集成微信App支付

在实际的项目中可能是这样使用的:

1.APP端调用后台接口生成一个订单,返回的数据中可能会包含订单id
2.APP端使用订单id,调用后台的接口,后台创建一个微信支付订单(统一下单接口),此时返回给APP的数据,可能会包含如下的数据:

返回的数据

3.APP端使用刚才返回的数据,调起微信支付:

PayReq *request = [[[PayReq alloc] init] autorelease];
request.partnerId = @"10000100";
request.prepayId= @"1101000000140415649af9fc314aa427";
request.package = @"Sign=WXPay";
request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";
request.timeStamp= @"1397527777";
request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256";
[WXApi sendReq:request];

4.APP端等待支付结果回调

可能形式如下:

-(void)onResp:(BaseResp*)resp{
  if ([respisKindOfClass:[PayRespclass]]){
      PayResp*response=(PayResp*)resp;
      switch(response.errCode){
          caseWXSuccess:
                    //服务器端查询支付通知或查询API返回的结果再提示成功
                    NSlog(@"支付成功");
            break;
            default:
            NSlog(@"支付失败,retcode=%d",resp.errCode);
            break;
      }
        }
    } 

如果支付成功则去后台查询支付结果再展示用户实际支付结果,所以还要调后台的接口,这里可能会有延迟,所以可能需要调用多次。如果后台确认成功,则表示支付成功


可参考官方文档APP支付

准备工作

参考:

前期的准备包括:

1.创建应用获取app ID和appSecre
2.开通支付功能
3.获取邮件里商户号和账号密码
4.商户平台,下载证书,获得api秘钥

集成SDK

1.项目设置APPID

项目设置APPID

2.注册APPID

AppDelegateapplication:didFinishLaunchingWithOptions:方法中注册APPID

[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];

也要实现如下的方法,参考官方的demo:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return  [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}

3.调起支付

商户服务器生成支付订单,先调用【统一下单API】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:

PayReq *request = [[[PayReq alloc] init] autorelease];
request.partnerId = @"10000100";
request.prepayId= @"1101000000140415649af9fc314aa427";
request.package = @"Sign=WXPay";
request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";
request.timeStamp= @"1397527777";
request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256";
[WXApi sendReq:request];

4.支付结果回调
照微信SDK Sample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意 一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:

-(void)onResp:(BaseResp*)resp{
              if ([respisKindOfClass:[PayRespclass]]){
                  PayResp*response=(PayResp*)resp;
                  switch(response.errCode){
                      caseWXSuccess:
                                //服务器端查询支付通知或查询API返回的结果再提示成功
                                NSlog(@"支付成功");
                        break;
                        default:
                        NSlog(@"支付失败,retcode=%d",resp.errCode);
                        break;
                  }
                    }
                } 

回调中errCode值列表:

名称 描述 解决方案
0 成功 展示成功页面
-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。

业务流程

业务流程

商户系统和微信支付系统主要交互说明:
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。
步骤5:商户后台接收支付通知。
步骤6:商户后台查询支付结果。

官方的Demo,对API进行了进一步的封装,WXApiManager类实现了WXApiDelegate协议,实现了onResp:方法,如下:

- (void)onResp:(BaseResp *)resp {
    if([resp isKindOfClass:[PayResp class]]){
        //支付返回结果,实际支付结果需要去微信服务器端查询
        NSString *strMsg,*strTitle = [NSString stringWithFormat:@"支付结果"];

        switch (resp.errCode) {
            case WXSuccess:
                strMsg = @"支付结果:成功!";
                NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
                break;

            default:
                strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
                NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
                break;
        }
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
    }else {
    }
}
2016-08-12 22:38:46 wenxiangjiang 阅读数 2467

iOS仿微信弹出框LPActionSheet

LPActionSheet是一款轻量级的仿微信弹出框

安装

从CocoaPods安装

CocoaPods可以优雅地管理第三方库(具体使用方式我在另一篇文章有详细介绍,这里不再赘述)

  • 第一步: 在Podfile文件中写入如下代码
pod 'LPActionSheet', '~> 1.0'
  • 第二步: 将文件安装进项目中
pod install
从Github上手动添加
  • 第一步: 到 这里 下载代码文件,将LPActionSheet/LPActionSheet文件夹拖到项目中
  • 第二步: 将头文件加入项目中 #import “LPActionSheet.h”

如何使用LPActionSheet

你可以像这样实例化一个对象 (该方法为指定初始化器,其他初始化方法都会调用该方法,NS_DESIGNATED_INITIALIZER)

- (instancetype)initWithTitle:(NSString *)title
            cancelButtonTitle:(NSString *)cancelButtonTitle
       destructiveButtonTitle:(NSString *)destructiveButtonTitle
            otherButtonTitles:(NSArray *)otherButtonTitles
                      handler:(LPActionSheetBlock)actionSheetBlock NS_DESIGNATED_INITIALIZER;

你可以像这样快速返回一个实例化对象

+ (instancetype)actionSheetWithTitle:(NSString *)title
                   cancelButtonTitle:(NSString *)cancelButtonTitle
              destructiveButtonTitle:(NSString *)destructiveButtonTitle
                   otherButtonTitles:(NSArray *)otherButtonTitles
                             handler:(LPActionSheetBlock)actionSheetBlock;

使用如下方法弹出该视图

- (void)show;

终极解决方案 (推荐)

+ (void)showActionSheetWithTitle:(NSString *)title
               cancelButtonTitle:(NSString *)cancelButtonTitle
          destructiveButtonTitle:(NSString *)destructiveButtonTitle
               otherButtonTitles:(NSArray *)otherButtonTitles
                         handler:(LPActionSheetBlock)actionSheetBlock;

Demo

[LPActionSheet showActionSheetWithTitle:@"This is a title, you can show some prompt here"
                      cancelButtonTitle:@"Cancel"
                 destructiveButtonTitle:@"Destructive"
                      otherButtonTitles:@[@"First choice", @"Second choice", @"Third choice"]
                                handler:^(LPActionSheet *actionSheet, NSInteger index) {
        NSLog(@"%ld", index);
}];

竖屏

LPActionSheet.png

横屏

LPActionSheet_Landscape.png

后续更新

该框架后续会在Github上维护更新,欢迎关注

https://github.com/wenxiangjiang/LPActionSheet

2019-04-13 12:32:19 Lydiadai 阅读数 121

1.微信小程序分享图片不能超过32k 否则分享不出去
2.微信小程序分享图片必须是nsdata格式

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"shareMiniprogram" ofType:@"png"];
        NSData *image = [NSData dataWithContentsOfFile:filePath];

所以一定要这么取

ps:有时候图片拖进项目里会找不到图片这个时候需要选中图片之后选择菜单中的
Source Control —> add selected files 就加进去了

2016-03-04 08:52:07 fuzongjian 阅读数 548

微信在很多项目中都可能用到,所以掌握微信支付是非常非常有必要,下面就简单的介绍微信支付的两种方法。

第一种,把相应的参数传给后台,后台返回关于微信支付的相关参数,我们拿到这些参数去完成支付,这种方法相对比较简单,但也最常用。

首先你必须有和微信支付相关的appid,记住这个appid和微信分享的appid是两码事

然后配置工程。

一、libWeChatSDK.a、WXApi.h、WXApiObject.h三个文件导入工程中,下载地址:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1

二、导入系统库TARGETS>>Build Phases>>Link Binary With Libraries点击“+”一次添加下面的系统库

CoreTelephony.framework、

Security.framework、

SystemConfiguration.framework、

UIKit.framework、

Foundation.framework、

CoreGraphics.framework、

libsqlite3.tcd、

libz.tbd、


三、项目注册微信支付、配置白名单、支付回调

注册

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    
    [WXApi registerApp:APP_KEY withDescription:@"微信测试"];//记得配置白名单
    
    return YES;
}

代理回调<WXApiDelegate>

-(BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(nonnull id)annotation{
    if ([url.host isEqualToString:@"pay"]) {
        return [WXApi handleOpenURL:url delegate:self];
    }
    return YES;
    
}
-(BOOL)application:(UIApplication *)app handleOpenURL:(nonnull NSURL *)url{
    if ([url.host isEqualToString:@"pay"]) {
        return [WXApi handleOpenURL:url delegate:self];
    }
    return YES;
}
-(void)onResp:(BaseResp *)resp{
    NSString *strTitle;
    if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
        strTitle = [NSString stringWithFormat:@"发送媒体消息结果"];
    }
    if ([resp isKindOfClass:[PayResp class]]) {
        strTitle = [NSString stringWithFormat:@"支付结果"];
        switch (resp.errCode) {
            case WXSuccess:
            {
                NSLog(@"支付结果: 成功!");
            }
                break;
            case WXErrCodeCommon:
            { //签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
                
                NSLog(@"支付结果: 失败!");
            }
                break;
            case WXErrCodeUserCancel:
            { //用户点击取消并返回
                NSLog(@"用户点击取消并返回");
            }
                break;
            case WXErrCodeSentFail:
            { //发送失败
                NSLog(@"发送失败");
            }
                break;
            case WXErrCodeUnsupport:
            { //微信不支持
                NSLog(@"微信不支持");
            }
                break;
            case WXErrCodeAuthDeny:
            { //授权失败
                NSLog(@"授权失败");
            }
                break;
            default:
                break;
        }
        //------------------------
    }

}

白名单配置

TARGETS>>info>>URL Types>>“+”>>URL Schemes 粘贴上appid

最后,准备就绪,把相应的参数传给后台,后台返回关于微信支付的相关参数,我们拿到这些参数去完成支付,当然参数的处理必需要和后台商量好。(调起微信支付前判断用户是否装了微信客户端)

 //调起微信支付
            PayReq* req             = [[PayReq alloc] init];
            req.partnerId           = [dict objectForKey:@"partnerId"];//商户号,
            req.prepayId            = [dict objectForKey:@"prepayId"];//包含了商品的所有信息
            req.nonceStr            = [dict objectForKey:@"nonceStr"];//随机字符串
            req.timeStamp           = stamp.intValue;//时间戳
            req.package             = [dict objectForKey:@"package"];@"Sign=WXPay"固定不变
            req.sign                = [dict objectForKey:@"sign"];//签名
            [WXApi sendReq:req];

至此,不出意外的话,微信支付就差不多了。



2016-02-24 14:47:53 qq_30107193 阅读数 231

iOS 中有摇动要实现的方法:

- (void)motionBegan:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);

- (void)motionEnded:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);


我们需要在ViewController的viewDidLoad方法中加入

  //可以晃动

 [[UIApplication sharedApplication] setApplicationSupportsShakeToEdit:YES];

    //成为第一响应

 [self becomeFirstResponder];

//然后去实现那几个方法就可以了


- (void) motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event


{

    

    //检测到摇动

    NSLog(@"开始摇动");

    

    //振动效果

    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

    //upImageView上移

    CABasicAnimation *upAnimation = [CABasicAnimation animationWithKeyPath:@"position.y"];

    upAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

    upAnimation.fromValue = @([UIScreen mainScreen].bounds.size.height/4);

    upAnimation.toValue = @(0);

    upAnimation.duration = 1;

    upAnimation.repeatCount = 1;

    upAnimation.autoreverses = YES;

    [self.upImageView.layer addAnimation:upAnimation forKey:@"upAnimation"];

    //downImageView下移

    CABasicAnimation *downAnimation = [CABasicAnimation animationWithKeyPath:@"position.y"];

    downAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

    downAnimation.fromValue = @([UIScreen mainScreen].bounds.size.height/4*3);

    downAnimation.toValue = @([UIScreen mainScreen].bounds.size.height);

    downAnimation.duration = 1;

    downAnimation.repeatCount = 1;

    downAnimation.autoreverses = YES;

    

    

    

    [self.downImageView.layer addAnimation:downAnimation forKey:@"downAnimation"];

}




- (void) motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event


{

    

    //摇动取消

    NSLog(@"取消摇动");

    

}




- (void) motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event


{

    

    //摇动结束

     NSLog(@"摇动结束");

    [self.activity stopAnimating ];

    

    if (event.subtype == UIEventSubtypeMotionShake) {

        

        //something happens

        

    }

    

}




iOS之微信支付

阅读数 518

iOS微信支付解析

博文 来自: wanglei0918

iOS 添加微信分享

阅读数 2746

ios微信支付

阅读数 759

ios开发OC微信支付

博文 来自: L_weiguo
没有更多推荐了,返回首页