iOS调起微信,qq,支付宝app支付总结

一.调起微信支付
  1. 申请应用id见官方文档
  2. 需要的资源文件SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h
  3. info中添加申请的微信key,idenfifirer为weixin,urlSchema为申请的key
  4. appdelegate中添加如下代码:
    //如果是微信的话 那么
    - (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {

    if([[url absoluteString] hasPrefix:ONEWeiXin]) {
        [WXApi handleOpenURL:url delegate:self];
    }

    //other ...

    return YES;
    }

    //appdelegate 为代理实现下面两个代理方法处理请求和返回
-(void) onReq:(BaseReq*)req {
    DDLogInfo(@"wx :openid - >%@",req.openID);
}

//处理微信回调结果
-(void) onResp:(BaseResp*)resp {
    if ([resp isKindOfClass:[PayResp class]]) {
       if (payResponse.errCode == WXSuccess) {
        //微信SDK支付成功消息
        NSLog(@"PayResp WXSuccess");

        //微信SDK支付成功
   }
    else {
        //用户取消微信支付
        if (payResponse.errCode == WXErrCodeUserCancel) {
            //微信SDK用户取消微信支付,无需处理
            NSLog(@"PayResp WXErrCodeUserCancel");
       }
        //其他错误
        else {
            //微信SDK其他支付错误
            NSString *eventStr = [NSString stringWithFormat:@"PayResp error other:%d", payResponse.errCode];
            NSLog(@"%@", eventStr);
       }
    }
    }
}

在微信实际调起代码中加入如下代码:

- (void)launchWxpay {
    //使用appid注册微信
    BOOL registerApp = [WXApi registerApp:@"##"];

    if (!registerApp) {
        NSLog(@"WXApi registerApp Failed!");
    }

    ONEPrePayResponse *prepay = [[ONEPayStore sharedInstance] prePayData];
    prepay.package = @"Sign=WXPay";

    PayReq *payRequest      = [[PayReq alloc] init];
    payRequest.openID       = prepay.appid;
    payRequest.partnerId    = prepay.partnerid;
    payRequest.prepayId     = prepay.prepayid;
    payRequest.nonceStr     = [prepay.noncestr stringValue];
    payRequest.timeStamp    = [prepay.timestamp intValue];
    payRequest.package      = prepay.package;
    payRequest.sign         = [self generateSignWithPay:prepay];

    BOOL isResult = [WXApi sendReq:payRequest];

    if (isResult) {
        //添加事件监听微信支付成功消息
        [self addNotifications];
    }
    else {
        if (![WXApi isWXAppInstalled]) {
            NSString *tipMsg = @"您的手机未安装手机微信或微信版本过低,请升级微信后方可使用微信支付";

            [UIAlertView alertWithCallBackBlock:^(NSInteger buttonIndex) {}
                                          title:@""
                                        message:tipMsg
                               cancelButtonName:@"我知道了"
                              otherButtonTitles:nil, nil];

            [self postNotificationWithStatus:ONEPayState_WeiXinPay_NotInstalled];

            return;
        }
        else {
            //用户手机未安装微信、微信版本太低、微信客户端卡住、WXApi的registerApp的appid参数有误

            [UIAlertView alertWithCallBackBlock:^(NSInteger buttonIndex) {}
                                          title:nil
                                        message:@"支付繁忙,请稍候再试~"
                               cancelButtonName:@"确定"

                              otherButtonTitles:nil, nil];
            [self postNotificationWithStatus:ONEPayState_WeiXinPay_Fail];
        }
    }
}
//计算签名
- (NSString *)generateSignWithPay:(ONEPrePayResponse *)response
{
    // 构造参数列表
    NSMutableDictionary *params = [NSMutableDictionary dictionary];

    [params setValue:kWebChatKey forKey:@"appid"];
    [params setValue:response.appkey forKey:@"appkey"];
    [params setValue:[NSString stringWithFormat:@"%@",response.noncestr] forKey:@"noncestr"];
    [params setValue:response.package forKey:@"package"];
    [params setValue:response.partnerid forKey:@"partnerid"];
    [params setValue:response.prepayid forKey:@"prepayid"];
    [params setValue:response.timestamp forKey:@"timestamp"];

    NSArray *keys = [params allKeys];
    keys = [keys sortedArrayUsingComparator:^NSComparisonResult(NSString *str1, NSString *str2) {
        return [str1 compare:str2];
    }];

    NSMutableString *sig = [NSMutableString string];
    for (int i = 0; i < [keys count]; ++i) {
        NSString *key = [keys objectAtIndex:i];
        NSString *value = [params objectForKey:key];
        [sig appendString:key];
        [sig appendString:@"="];
        [sig appendString:value];
        [sig appendString:@"&"];
    }

    NSString *signStr = [sig substringToIndex:sig.length - 1];

    return [WeChatPayWay sha1:signStr];
}

+ (NSString *)sha1:(NSString *)str
{
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(data.bytes, (unsigned int)data.length, digest);
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
    {
        [output appendFormat:@"%02x", digest[i]];
    }
    return output;
}

注意package固定值,sign为计算出的结果,大小写一定要对应正确

二.调起QQ支付
  1. 已有appname和appkey,appname用于url,app之间跳转,identifier为appname,url为urlschema的内容.添加到info的url中.
  2. appdelegate中注册,并在url代理方法中添加返回结果的处理代码,如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    /*注册qq钱包支付*/
    [QQWalletSDK registerQQWalletApplication:ONEQQPay // app id
                                   urlScheme:kQQpayURLScheme
                                        name:kQQpayAppName];
                                        //....
}

//处理url

#pragma mark -  UIApplicationDelegate
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
        //处理qq钱包支付流程
    [QQWalletSDK QQWalletSDKHanldeApplication:application openURL:url  sourceApplication:sourceApplication annotation:annotation];
    return YES;
    }

//调用代码
/*
 开始q钱包支付
 0 --- 成功
 1 --- 支付过程中用户取消
 3 --- 参数错误
 -11000 --- 用户操作中离线(可能同帐号在其他设备登录)
 -11001 --- 支付过程中用户取消
 -11003 --- 参数错误
 28027608 -- 用户绑卡过程中,手机号码与帐号登记的号码不符合,无法继续 
 28027201 -- 该订单已经支付
 66210007 -- 帐号未登录,或者登录已超时
 */

- (void)launchQQPay {
    if (![QQWalletSDK isSupportQQWallet]) {

        [UIAlertView alertWithCallBackBlock:^(NSInteger buttonIndex) {}
                                      title:nil
                                    message:@"请先安装手机QQ"
                           cancelButtonName:@"确定"
                          otherButtonTitles:nil, nil];

    } else {

        ONEPrePayResponse *resp = [[ONEPayStore sharedInstance] prePayData];

        if (!resp.appId || !resp.bargainorId || !resp.token_id || !resp.sig || !resp.nonce) {
            DDLogInfo(@"qqpay resp: %@", resp);

            [UIAlertView alertWithCallBackBlock:^(NSInteger buttonIndex) {} title:nil message:@"QQ钱包支付失败,请稍后再试!" cancelButtonName:@"确定" otherButtonTitles:nil, nil];

        } else {
            [QQWalletSDK startPayWithAppId:resp.appId bargainorId:resp.bargainorId tokenId:resp.token_id signature:resp.sig nonce:resp.nonce completion:^(QWMessage *message, NSError *error) {
                /**
                 0 --- 成功
                 1 --- 支付过程中用户取消
                 3 --- 参数错误
                 -11000 --- 用户操作中离线(可能同帐号在其他设备登录)
                 -11001 --- 支付过程中用户取消
                 -11003 --- 参数错误
                 28027608 -- 用户绑卡过程中,手机号码与帐号登记的号码不符合,无法继续
                 28027201 -- 该订单已经支付
                 66210007 -- 帐号未登录,或者登录已超时
                 */

                ONEOrderPayStatus status = ONEPayState_default;
                if (error) {
                    DDLogError(@"%@",[error localizedDescription]);
                    status = PayState_QQPay_PayError;
                } else {
                    switch (message.code) {
                        case 0:
                            status = PayState_QQPay_PaySuccess;
                            break;
                        case 1:
                        case 11001:
                            status = PayState_QQPay_PayCancel;
                            break;
                        case 3:
                            status = PayState_QQPay_PayParamError;
                            break;
                        case 11000:
                            status = PayState_QQPay_PayOffeline;
                            break;
                        case 28027608:
                            status = PayState_QQPay_PayPhoneNumError;
                            break;
                        case 28027201:
                            status = PayState_QQPay_PayHavePaid;
                            break;
                        case 66210007:
                            status = PayState_QQPay_PayLoginError;
                        default:
                            break;
                    }
                }

                [self postNotificationWithStatus:status];

            }];
        }
    }
}

注意bundleid一定要对应对.

三.调起支付宝

1.appdelegate中处理url代码里添加跳转处理代码,这里处理回调

if([[url absoluteString] hasPrefix:AliPay]){//支付宝支付的key,是申请的
        //如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDK
        if ([url.host isEqualToString:@"safepay"]) {
            [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
                NSLog(@"safepay result = %@",resultDic);
            }];
        }
        if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回 authCode
            [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
                NSLog(@"platformapi result = %@",resultDic);
            }];
        }

    }

2.实际调起代码如下

 - (void)launchAliPay {
    @weakify(self)
        [[AlipaySDK defaultService] payOrder:prepay.prepaystr fromScheme:prepay.appkey callback:^(NSDictionary *resultDic) {

        @strongify(self)
        int completeState = ONEPayState_default;

        int resCode = [[resultDic objectForKey:@"resultStatus"] intValue];
        NSString * resultStr = [resultDic objectForKey:@"result"];
        NSString *trueStr = @"";
        if(resultStr && [resultStr length] > 0){
            NSString *subStr = @"&success=";
            NSRange range = [resultStr rangeOfString:subStr];
            if(resultStr.length > range.length + 5){//起码大于5以上 才能截取5
                trueStr = [resultStr substringWithRange:NSMakeRange (range.location+ range.length + 1, 4)];
            }
        }

        if (resCode == 9000 && [trueStr isEqualToString:@"true"])//支付成功
        {
            completeState = PayState_Alipay_PaySucess;
        }else if (resCode == 8000){
            completeState = PayState_Alipay_PayIng;
        }else if (resCode == 4000){
            completeState = PayState_Alipay_PayError;
        }else if (resCode == 6001){
            completeState = PayState_Alipay_PayCancel;
        }else if (resCode == 6002){
            completeState = PayState_Alipay_NetError;
        }else {
            completeState = PayState_Alipay_NotKnow_Error;
        }

        [self postNotificationWithStatus:completeState];
    }];

}

支付宝的秘钥等放在服务端,有服务端传递回参数
ps.在实际支付集成中尽量把每一个参数都对应好,很多错误是没有错误日志.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Uni-app是一种跨平台的开发框架,可以方便地开发出适用于多个终端的应用程序,包括Web、iOS、Android等。在开发过程中,我们可以使用uni-app提供的API实现多种功能,比如调用微信支付。 首先,我们需要在应用程序内引入微信支付所需的SDK,在Uni-app中可以使用插件机制,自己开发一个插件或者使用已有的插件,如uni-wxpay等。然后,在APP内调用微信支付的流程如下: 1.在创建支付订单时,需要将订单信息传递给服务端,由服务端生成订单号、调用微信支付API生成预支付订单,并返回给APP。 2.APP拿到预支付订单后,调用微信SDK内置的API进行支付,主要包括支付参数的配置和支付的发起。 3.支付完成后,微信会回调我们在服务端注册的回调地址,服务端通过请求微信的API对支付结果进行核对,确认支付是否成功,并作出相应的处理。 需要注意的是,在调用微信支付API时需要在微信开放平台申请开发者账号,并完成相应的配置,包括设置支付回调地址、支付授权目录等等。 总之,通过调用微信支付API,我们可以为APP添加支付功能,实现线上商品购买、捐赠赞赏等功能。而在Uni-app中,使用插件机制可以更加方便快捷地完成这个流程。 ### 回答2: uni-app 是一个可以跨平台开发的框架,它支持开发微信小程序、支付宝小程序、H5 等多个平台。在 uni-app 中内调用微信支付可以实现用户在应用内进行支付,下面我将具体介绍 uni-app 中如何进行内调用微信支付。 1. 首先需要在应用中安装微信支付插件,打开 HBuilderX,选择菜单栏中的“插件市场”,搜索“微信支付”,选择安装。 2. 在应用中使用微信支付的页面中引入微信支付插件: ```javascript import $payment from "@/uni_modules/yk-payment/js_sdk/uni-payment.js"; // 引入插件 ``` 3. 在需要支付的位置,调用微信支付的方法: ```javascript uni.showLoading({ title: '加载中' }); $payment.weixinPay({ timeStamp: '1603388794', nonceStr: '5pnskrq5060pt2lljndzpta9hzqmxrsq', package: 'prepay_id=wx30163954528026d7bf482abf2becd37124', signType: 'MD5', paySign: '3ACA84580DD8C32D8478B4BBF3688A1D', success: function (res) { console.log('success:' + JSON.stringify(res)); }, fail: function (err) { console.log('fail:' + JSON.stringify(err)); }, complete: function (res) { uni.hideLoading(); } }); ``` 其中,微信支付需要提供以下参数: - timeStamp:时间戳,单位为秒 - nonceStr:随机字符串,不长于 32 位 - package:统一下单接口返回的 prepay_id,参考[微信支付开发文档](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1)中获取订单号 - signType:签名算法,目前支持 MD5 和 HMAC-SHA256 - paySign:签名,具体签名方式详见[微信支付开发文档](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1) 微信支付成功后会回调 success 回调函数,失败则回调 fail 回调函数。 4. 在微信支付的后端接口中,需要根据微信支付返回的结果进行签名校验,确保订单的真实性。 综上所述,使用 uni-app 内调用微信支付步骤相对简单,只需安装微信支付插件,调用支付方法即可,但支付过程中需要注意时间戳、随机字符串、签名等参数的正确性,同时在后端接口中校验微信支付的签名以确保支付的真实性。 ### 回答3: Uni-app是一个跨平台开发框架,它可以让开发者一次编写代码,同时在多个平台上运行。微信支付是一个广为人知的移动支付平台,它可以提供便捷的支付服务。在实践中,我们可以使用Uni-app中的支付插件来在应用程序中调用微信支付。下面是如何实现Uni-app应用程序内调用微信支付: 1. 首先,安装支付插件在Uni-app开发环境中,可以通过npm安装。 2. 在支付插件内部,我们需要引用微信支付的API,以便在我们的应用程序中调用这些API来实现支付。这些API包括支付API、查询订单API、退款API等等。 3. 接下来,我们需要在我们的代码中调用支付API,这个API用于请求加载微信支付。当用户点击订单支付按钮时,我们可以在后台发送一个请求,请求加载微信支付页面和所需的支付参数。 4. 在向微信支付发送请求后,我们需要接收来自微信支付的响应,然后将结果传递给我们的应用程序。通常,微信支付会将支付结果返回给我们的后台服务器,然后我们可以将结果传递给我们的应用程序。我们可以使用Uni-app的API来轮询服务器以获取结果。 5. 最后,我们需要在我们的应用程序中向用户显示支付结果。如果支付成功,我们可以向用户显示订单确认信息。如果支付失败,我们可以向用户显示错误信息。 总之,Uni-app应用程序的开发者可以使用插件实现在应用程序中调用微信支付。开发者需要在插件内部引用微信支付API,然后在代码中调用它们来实现支付。最后,我们需要接收来自微信支付的响应,并在我们的应用程序中向用户显示支付结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值