如果使用了pod,只有审核通过的应用才能进行开

时间:2019-10-03 22:51来源:美高梅手机游戏网站
现在我们好多开发应用几乎80%都用到了支付接口,小程序,公众号,App在微信支付上有什么相似于不同呢? 刚集成完微信支付,总结总结 1. 申请AppID 请到 开发者应用登记页面进行登记

现在我们好多开发应用几乎80%都用到了支付接口,小程序,公众号,App在微信支付上有什么相似于不同呢?

刚集成完微信支付,总结总结

1. 申请AppID

请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将该应用提交审核,只有审核通过的应用才能进行开发。

  • 申请开发者资质认证,年费300RMB。
  • 创建应用,审核通过后即可使用微信登录、分享功能(需要应用的包名和签名)。
  • 微信支付需要额外开通。

审核速度一般很快,1-2个工作日即可完成。建议审核完成后再接入调试,否则可能会产生各种各样的奇葩错误,甚至无法正常唤起。
注意:微信开发平台和公众号平台是不同的两个平台,账号不能互通。

一.APP支付(

1. 准备

微信平台分为微信公众平台和微信开放平台,公众平台是运营微信公众号的管理系统,开放平台主要针对app、网站开发,提供登录、分享、支付等功能。

注册开放平台之后,新建应用,填写应用信息(Android、iOS等信息),创建之后需要等待审核(这个审核很快的,几个小时就通过了)。

然后是为该应用申请支付功能,要注意个人是无法申请的,具体可参考微信支付申请条件和资格。这里牵涉到一系列公司资质的审核和费用支付,需要几个工作日的时间

完成之后可以获取到appid(微信开放平台为应用生成的唯一识别码)、商户id、商户secretKey。对于app端来说只用到appid,商户id最好通过接口从server获取,商户secretKey是用来签名的,一般只有server能用到。

2. 下载SDK及API文档

微信SDK改成通过Gradle的方式发布到jcenter,包名做了相应修改,从原来的com.tencent.mm.sdk修改为com.tencent.mm.opensdk,需要开发者修改对应的import语句。
build.gradle文件中,添加如下依赖即可:

dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}

dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

(其中,前者包含统计功能)

图片 1配置

2. 支付流程

先上一个开放平台给出的流程图:

图片 2

支付流程.png

这个图很实用很详细很清晰,但一开始看可能会觉得复杂。其实对开发者来说,比较关心的流程是:

  1. app向server发起支付请求
  2. server收到请求后向微信后台调用统一下单API,获得预付单信息
  3. server生成带签名的客户端支付信息并返回给app
  4. 用户确认支付,app调起微信客户端进行支付
  5. app获得支付结果后向server查询最终结果并显示

流程了解之后,了解下需要定义的接口和前后端的具体工作:

3. 搭建开发环境

在Android Studio中新建你的工程,并保证网络设置可以成功从jcenter下载微信SDK即可。

2.业务流程

新接口:
  • app向server发起请求,获得签名后的app支付信息
  • app支付之后向server查询支付结果(微信回调的结果不可信,必须以server的结果为准)

4. 在代码中使用开发工具包

图片 3流程

app需要做的:
  • 项目接入微信支付sdk
  • 向server请求支付信息
  • 用支付信息调起微信客户端,然后支付
  • 收到微信回调之后向server查询支付结果
  • 根据支付结果展示页面

[1] AndroidManifest.xml 设置

添加必要的权限支持:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

3.下载并运行demo其实把demo看明白了,直接运用到自己的app里,也不是不可以的4.设置项目

server需要做的:
  • 收到app端支付请求后调用统一下单API向微信后台获取预支付信息
  • 将app端需要的支付信息签名之后返回给app
  • 接收微信后台回调信息(支付结果),以供app查询

[2] 注册到微信

要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id。如下图所示,可以在程序入口Activity的onCreate回调函数处,或其他合适的地方将你的应用id注册到微信。注册函数示例如下图所示。

Paste_Image.png

  1. 在Xcode中,projectName-->Info-->URL Types 添加appid。设置之后才能实现应用间跳转

3. iOS开发

开发文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1

  1. 下载并运行demo
    其实把demo看明白了,直接运用到自己的app里,也不是不可以的
  2. 设置项目
    在Xcode中,projectName-->Info-->URL Types 添加appid。设置之后才能实现应用间跳转
![](https://upload-images.jianshu.io/upload_images/2411791-9c2cfed134475ded.png)

urltypes.png

导入sdk

图片 4

sdk.png

如果使用了pod,直接在Podfile中添加pod 'WechatOpenSDK' 然后执行 pod update即可。如果没有使用pod,在添加了sdk文件包之后,需要在pojectName-->General-->Linked Frameworks and Libraries 中添加相应内容

图片 5

libs.png

  1. 代码
  • AppDelegate.m
    didFinishLaunchingWithOptions方法中
    [WXApi registerApp:@"wx000999888777"];//注册appid
    openUrl、handleOpenURL方法
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return  [WXApi handleOpenURL:url delegate:[PaymentManager sharedManager]];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [WXApi handleOpenURL:url delegate:[PaymentManager sharedManager]];
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
    return [WXApi handleOpenURL:url delegate:[PaymentManager sharedManager]];
}

如果之前项目中使用了友盟等第三方框架,直接并排写就可以:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    [WXApi handleOpenURL:url delegate:[PaymentAction sharedPayment]];
    [UMSocialSnsService handleOpenURL:url];
    return YES;
}

另外,这个地方的delegate也可以直接设置成nil,表示用当前AppDelegate作为微信支付的代理,这样一来支付回调写在AppDelegate.m中即可。
但不推荐这种做法,我是设置了PaymentManager作为代理,这是项目中专门管理支付的一个类,包括之前的支付宝支付。这也是微信demo中的做法。(支付宝是用block获取回调的,个人感觉代码更紧凑,不容易乱;微信是用的代理,刚开始看晕乎乎的)

  • PaymentManager
    首先是遵守协议WXApiDelegate
    然后在PayVC中通过接口获取支付信息
    然后调起微信客户端:
- (void)weiXinPayWithDic:(NSDictionary *)wechatPayDic {
    PayReq *req = [[PayReq alloc] init];
    req.openID = [wechatPayDic objectForKey:@"appId"];
    req.partnerId = [wechatPayDic objectForKey:@"partnerId"];
    req.prepayId = [wechatPayDic objectForKey:@"prepayId"];
    req.package = [wechatPayDic objectForKey:@"packages"];
    req.nonceStr = [wechatPayDic objectForKey:@"nonceStr"];
    req.timeStamp = [[wechatPayDic objectForKey:@"timesTamp"] intValue];
    req.sign = [wechatPayDic objectForKey:@"sign"];
    [WXApi sendReq:req];
}

这里的数据wechatPayDic一定是server经过二次签名的

回调

// 微信支付返回结果回调
- (void)onResp:(BaseResp *)resp {
    if ([resp isKindOfClass:[PayResp class]]) {

        PayResp *response = (PayResp *)resp;
        if (_delegate && [_delegate respondsToSelector:@selector(managerDidRecvPaymentResponse:)]) {
            [_delegate managerDidRecvPaymentResponse:response];
        }
    }
}

当然前提是在PaymentManager.h中已经定义了代理:

@protocol WXApiManagerDelegate <NSObject>

@required
- (void)managerDidRecvPaymentResponse:(PayResp *)response;
@end

@interface PaymentManager : NSObject <WXApiDelegate>

@property (nonatomic, assign) id<WXApiManagerDelegate> delegate;

这个代理是用来处理回调结果,展示页面的,所以设置成PayVC控制器

处理回调结果
PayVC.m
遵守协议WXApiManagerDelegate
在viewDidLoad中设置[PaymentManager sharedManager].delegate = self;

- (void)managerDidRecvPaymentResponse:(PayResp *)response {
        switch (response.errCode) {
            case WXSuccess:
                [self checkWechatPayResult];
                break;
            case WXErrCodeUserCancel:
                [[HintManager shareManager] showHint:@"中途取消"];
                break;
            default:{
                [[HintManager shareManager]showHint:@"支付失败"];
            }

                break;
        }
}

然后在checkWechatPayResult向server查询支付结果,刷新页面
哦了~~ 泼佛客特

[3] 发送请求或响应到微信

现在,你的程序要发送请求或发送响应到微信终端,可以通过IWXAPI的sendReqsendResp两个方法来实现。
boolean sendReq(BaseReq req)
sendReq是第三方app主动发送消息给微信,发送完成之后会切回到第三方app界面。
boolean sendResp(BaseResp resp)
sendResp是微信向第三方app请求数据,第三方app回应数据之后会切回到微信界面。
sendReq的实现示例,如下图所示:

Paste_Image.png

具体要发送的内容由第三方app开发者定义,具体可参考微信开发工具包中的SDK Sample Demo源码。

图片 6添加

4. 出现的问题

当然了,并不泼佛客特

  • 系统版本大于等于iOS9的,调起微信客户端之后,可以直接点击状态栏左侧按钮返回,这时是不走回调方法的。
    这样在支付成功之后,不走回调方法,就无法知道支付状态,当前页面无法给出提示。
    解决方案是,在AppDelegate.m的applicationWillEnterForeground方法中,调用查询支付结果接口然后刷新当然页面。需要设置bool变量作为标志,否则每次应用进入前台都去查询,就不符合业务要求了。
  • 进入微信支付页面之后,不做操作,切换到自己应用中,退出当前支付页面,然后再进入微信客户端点击支付或者取消,此时自己的应用会崩溃闪退
    原因是退出页面后页面已经出栈被销毁,但wx回调时还是去调用其中的代理方法,就会出现野指针。
    解决方法是,在页面的viewWillDisappear方法中加入[PaymentManager sharedManager].delegate = nil;

[4] 接收微信的请求及返回值

如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作:

a. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity(例如应用程序的包名为net.sourceforge.simcpux,则新添加的类如下图所示)

Paste_Image.png

并在manifest文件里面加上exported属性,设置为true,例如:

Paste_Image.png

b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法。

c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下图:

Paste_Image.png

当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。

2.导入sdk

5. 需要注意的点

  • 一定设置好scheme,否则应用无法跳转
  • 在调起微信支付使用的PayReq类,一定要用WXApi中自带的类,不要自己创建新类。我之前自己创建的类,定义了同样的变量,同样继承了BaseReq,然并卵,sendReq方法一直返回false
  • 调起微信支付的数据,一定是server经过二次签名的,不要把调用统一下单API获取到的数据直接返给app
  • 虽然类中的变量命名是驼峰式,但签名时的key值全部是小写的,签名时不要忘了后面加上商户key。

5. 代码混淆

为了保证sdk的正常使用,需要在proguard.cfg加上配置:

-keep class com.tencent.mm.opensdk.** {*;}
-keep class com.tencent.wxop.** {*;}
-keep class com.tencent.mm.sdk.** {*;}

以上是官方文档,接下来是私货。

Android Studio调试时默认会给应用加上Debug签名,这个签名和正式版的Release签名是不同的。只有当应用的签名和开发者平台创建应用时所填的签名一致时才能正常使用,可以测试时使用一个签名,正式上线时修改成正式版的签名。得益于Gradle的足够强大,我们可以使用Release版签名来调试app。

编辑:美高梅手机游戏网站 本文来源:如果使用了pod,只有审核通过的应用才能进行开

关键词: