幻蓝博客 – 孤月蓝风

追寻互联网科技、Unity开发、AR/VR开发、游戏开发、Web前后端开发等技术。

幻蓝博客 – 孤月蓝风幻蓝博客 – 孤月蓝风

Unity与iOS交互(二):接入微信支付SDK

本文是全系列中第2 / 4篇:Unity与iOS交互

开发环境:XCode 9.2 , Unity 2017.1.3

在开发项目时需要接入的SDK中,微信的SDK是最……坑……的,微信的SDK包括微信分享、微信登录、微信支付。接入的方式是一样的,坑的点在于,微信开放平台官方文档的极其不完善。其他SDK例如ShareSDK或极光推送等,都有专门的UnityPackage包,而且有文档教程,虽然也有些坑的地方,但还是可以很容易的接入。但微信的SDK只有原生接入方式,而且文档中的XCode版本是很古老的,这个也不是大问题,大问题是他的示例代码也是很古老且不完整的。

这篇文章就介绍如何接入微信支付SDK(微信分享SDK方式相同),你可以在微信开放平台的资源中心中找到SDK的文档及下载,阅读“iOS接入指南”来开始SDK的接入,从手动接入部分开始。

你可以将SDK的文件放入到Unity工程的 Assets / Plugins / iOS 文件夹中,到构建 XCode 工程后,会直接存放于 XCode 工程的 Libraries 文件夹中。或者,你可以构建 XCode 工程后,再将 SDK 文件导入,直接将三个文件 libWeChatSDK.a,WXApi.h,WXApiObject.h 拖入到 XCode 工程中,并勾选 Copy items if needed :

将SDK加入到XCode工程中

将SDK加入到XCode工程中

之后,我们进行将需要的 Frameworks 手动加入(自动加入请阅读后续的XUPorter教程)等步骤,这些步骤都可以按照官方文档中的3.2.3到3.2.6直接进行,为了防止官方文档更新后导致步骤对不上号,我这里简单列出这些步骤:

3.2.3:将Framework加入到工程中,在 XCode 工程的 Build Phases -> Link Binary With Libraries 中点击下面的 + 号添加:

添加Framework到XCode工程中

添加Framework到XCode工程中

3.2.4:在你的工程文件中选择Build Setting,在”Other Linker Flags”中加入”-Objc -all_load”,在Search Paths中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h

3.2.5:在XCode中,选择你的工程设置项,选中 TARGETS 一栏,在 info 标签栏的 URL type 添加 URL scheme 为你所注册的应用程序id

3.2.6:在XCode中,选择你的工程设置项,选中 TARGETS 一栏,在 info 标签栏的 LSApplicationQueriesSchemes 添加 weixin

接下来是3.2.7:在你需要使 用微信终端API的文件中import WXApi.h 头文件,并增加 WXApiDelegate 协议,这个操作我们在 UnityAppController.h 中完成(我们同样可以扩展UnityAppController.mm来进行这个操作,避免每次打包后重新修改UnityAppController,参考后续的扩展UnityAppController文章),查看下图中画线的地方:

UnityAppController.h中加入WXApiDelegate协议

UnityAppController.h中加入WXApiDelegate协议

接下来的在代码中使用工具包这一步的4.1我们在 UnityAppController.mm 中完成,首先找到文件中 didFinishLaunchingWithOptions 函数的位置,加入 [WXApi registerApp:@"wxa72a15850b99c773"];代码。

4.2中重写AppDelegate的handleOpenURL和openURL方法,Unity生成的代码中并不包含这两个函数,按文档中的代码直接增加即可。

4.3中实现WXApiDelegate协议的两个方法 onReq 和 sendReq 。这两个方法可以参考官方支付demo的代码,这里提供最简单的实现:

实现WXApiDelegate协议的两个方法 onReq 和 sendReq

实现WXApiDelegate协议的两个方法 onReq 和 sendReq

至此,XCode中 微信支付SDK 的接入就全部完成了,而且这里我们已经在 XCode 中使用 UnitySendMessage 向 Unity 端发送支付结果,Unity中接收后根据结果进行处理即可。但我们还没有完成调用支付的功能,我们新建一个 .h 和 .m 文件,文件名随意,我这里使用 NativeBridge 来命名,在里面实现原生的调用微信支付的代码。这两个文件我们可以在构建后 XCode 中引入,也可以直接存放于 Unity 项目的 Assets / Plugins / iOS 中,构建时会自动存放于 XCode 工程的 Libraries 文件夹中。

在 NativeBridge.h 中写入代码:

NativeBridge.h中的代码

NativeBridge.h中的代码

在 NativeBridge.m 中,写入代码:

NativeBridge.m中的代码

NativeBridge.m中的代码

_WXPay是我们定义的调用微信支付的函数,参数全部使用 char *name 来传入,使用 [NSString stringWithUTF8String:name] 来转换为 NSString ,这里需要注意两点

  1. request.openID 必须赋值,这一条在官方文档中没有说明,是在百度其他教程时发现的,android端也是如此。另外iOS端没有appid,只有android端有。
  2. timeStamp 必须是整形且为10位,精度是秒,上面代码中有转换方法。

如果调用时提示签名错误,那么很有可能是上面2点造成的。

调用的函数已经写好了,现在我们需要在 Unity 里面进行调用了,先引入原生代码中定义的调用函数:

引入原生代码中的调用函数

引入原生代码中的调用函数

之后在需要的地方传入参数并进行调用,参数应由服务器返回:

Unity中调起微信支付

Unity中调起微信支付

在微信支付处理完成或取消之后,会调用之前在 UnityAppController.mm 中定义的回调函数 OnResp ,再使用 UnitySendMessage 向 Unity 发送支付结果,UnitySendMessage 的使用方式可以参考Unity官方文档。

到这里,所有的微信支付的步骤就全部完成了,如有遗漏,欢迎反馈。

如果在 XCode 中添加的 OC 代码看不懂的话,强烈建议先阅读 OC 的基本教程。

文章导航