前文提到的苹果支付刚接完不久,项目又有了新的需求—android手机需要接入微信app支付。。。好吧,研究了微信支付官方的接入文档和官方demo,踩过大大小小无数的坑终于支付成功了!本文主要梳理下自己的工作以备以后不时之需!
和前文提到的苹果内购一样,在接微信app支付前我们需要先来大体了解下微信app支付的流程是怎样的:
这是微信官方给出的微信APP支付的业务流程,图示已经很详细了,作为前端我们要做的主要就是(2)选择商品下单;(3)请求生成支付订单(9)利用支付参数和SDK 拉起微信支付;以及最后的订单验证(这一步一般都是放在服务器),验证通过后客户端就算购买成功了。我会尽量写详细一些,因为如果以前没有接入SDK的经验,一些简单的细节确实很容易让你浪费好多的时间(哈,我自己就是-_-||)
首先我们需要到https://pay.weixin.qq.com微信官方支付平台申请账号支付权限(需要提交一些申请资料然后等待1-3天通过审核,因为这个是公司策划申请的我也不太清除其中细节,估计都是些按部就班的步骤,所以就不一一细说了),申请过后你就可以注册自己的应用了,注册成功通过审核后你的app信息会包含一些很重要的信息;AppID,AppSecret(这个我们客户端用不到,这个服务器请求微信的预支付订单用到的),当然有个界面非常重要:
这个应用包名需要和你的unity的packname一致,而且应用签名不要随便填,这个需要微信给的工具测出来的,上面的一些信息我会在后面详细的说怎么用的!
这里我是使用的Eclipse打的jar包,这里你首先需要把你的Android开发环境部署好,可以去参考这位大佬的文档,这里记录一下我碰见的一个坑,因为我电脑上同时安装了AndroidStudio和Eclipse,所以在部署ADT的时候SDK启动闪退,查了很多资料发现这是因为AndroidStudio和Eclipse同时使用了一个SDK,AndroidStudio这个软件会把使用的SDK里面的一些目录文件结构破毁掉,导致Eclipse识别不了启动失败,这里建议不要同时安装上述两个软件,如果非要使用可以复制两个SDK,分开使用就可以了,最后莫得办法我只好花费了一上午重新安装下SDK,问题解决!
这里首先你要有一定的Unity和Android交互的基础,网上有许多交互的小例子可以自行百度下(一定要先学会交互在尝试接入sdk,这很重要,会让少走很多弯路),不过大部分都只是罗列出来一堆代码,只能让人知其然不知其所以然,有时间我会记录一下详细的unity和android交互的文档,下文中我也会在一些细节上详细标注下。
为了方便我们可以去微信支付官网去把他的DEMO下载下来然后根据需求去修改就可以了,当然了一般接入SDK有两种方式第一种是把我们的项目导出一个安卓工程放在eclipse接入,还有一种是在eclipse导出我们做好的jar包在unity使用(这两种方式第一种适合项目的SDK二次开发,第二种比较简单直接),这里我是使用的第二种方式,下载下来Demo会有许多错误,基本上都是缺少类库,把相应的类库添加上就好了,Demo大概是这种结构:
Demo里面有其他的一些功能,我们只接入微信支付,所以可以把其他的功能干掉,当然了下面代码我都是用最简洁的方式去实现功能便于理解,可以参考一下我的目录:
其中MainActivity是我自己创建的继承UnityPlayerActivity的一个类(会交互的应该都知道。。。),LogUtil是一个工具类不用管,然后就可以在这基础上修改了,enmmm挨个来看吧,其中掺杂着一些个人的理解(仅作参考),先来看AppRegister类:
这个类不需要改动,这个类是把你的AppID注册到微信应用,没有其他的作用。
Constants类:
这个类就是一个数据类,存储我们的应用AppID,改成自己的AppID就好了,MD5和Util没有什么改动,而且是工具类就不贴图了,我们主要看一下MainActivity,PayActivity,WXPayEntryActivity这三个核心功能类;
这个就是我们自己创建的类了,当然了这个也是和我们unity交互的核心类,这里面你可以写你自己的交互流程,为了演示方便我就直接用最简单直接的方法了,直接把拉起微信支付的参数传递过来用自定义的WeixinPay方法接收,
(这里说明一下这些参数的来源,这个就是前后端自己商议的接口,前端把商品购买信息传递给后端,后端拿到数据后会根据微信支付官方提供的参数算法访问预支付订单接口,这个接口返回值就包含这些参数,然后会把这些参数传递给前端,你就拿到了!(理解流程就好,这里大部分工作都是后端做的,你只需要接收就好了)
然后我们在方法内去定义生成一个Demo给的一个支付类PayActivity,并且把参数传递过去,然后启动这个类startActivity!
这个就是拉起微信支付的类了,很简单也很好理解, 上面在MainActivity方法内传递过来的参数接收后利用微信给出的WXAPIFactory类发送数据!这一步在应用中表现就是跳出你的应用去拉起微信内支付了,也就是说如果你的代码没有问题到了这一步就已经能拉起微信支付了(当然要包括unity的设置内容。。。这个后面说),然后我们来看最后一个类WXPayEntryActivity:
这个类就是微信支付后的接收类了,我简单改了下官方Demo接收逻辑,这样更好理解,代码中都有注释就不解释了!
至此,微信支付Eclipse端的代码部分全部完成,官方的demo看着听多了,仔细摘取下也就这些代码量,是不是感觉非常简单(我当时鼓捣了好久o(╯□╰)o),
作为一个小白,因为以前自己没有导过jar包。。。查了查网上这方面的知识非常少而且让人摸不着头脑,所以此处详细说明下导Jar包的步骤供不会的参考下,有这方面经验的可以略过这一步往下看:
首先看一下官方的解释:
AndroidManifest官方解释是应用清单(manifest意思是货单),每个应用的根目录中都必须包含一个,并且文件名必须一模一样。这个文件中包含了APP的配置信息,系统需要根据里面的内容运行APP的代码,显示界面。
androidmainfest的作用:
上面就是官方的解释,通俗来讲就是定义应用的包名 开启应用的手机权限。这是一个xml文件,详细的元素属性可以参考这位大佬的文档,我主要说一下untiy中的androidmainfest,首先这个文件是可以存在多个的,只要放在android文件下就是合法的,打包时你需要注意你的packname和androidmainfest文件中要一致,sdk版本号要一致,要有一个main入口,其它的可以看上面的文档去限定就可以啦。
这里说明一下:在你build之后和关闭unity之前的这段周期内,unity会把你所有的androidmainfest文件整合在下面这个路径中,可以自己查看一下
嗯,在此贴出来我的文件,大家自行替换相关参数就可以了!
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="包名"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="26" />
<!-- Required 一些系统要求的权限,如访问网络等-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:label="@string/app_name" >
<activity
android:name="包名.MainActivity"
android:label="@string/app_name"
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="unspecified">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="你的appid"/>
</intent-filter>
</activity>
<activity
android:name="包名.PayActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<!--android:launchMode="singleTop">-->
</activity>
<activity
android:name="包名.wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="你的appid"/>
</intent-filter>
</activity>
<receiver
android:name=".AppRegister">
<intent-filter>
<action android:name="包名.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" />
</intent-filter>
</receiver>
</application>
</manifest>
导入jar包基本没有什么注意的,直接拖进去就可以了,大概这样
这里说一下几个小坑:
嗯,这里本来想贴出全部代码的,但看了看因为我通信是用的公司的http通信框架模块,而且还有自己和后端定义的接口,贴出来估计用处不大,我就把核心的方法贴出来把
private AndroidJavaObject jo;
private void Awake()
{
//这里说明一下,网上大部分都是“com.unity3d.player.UnityPlayer.currentActivity”这个参数
//实际上填写你的包名也可以
jo = new AndroidJavaObject("com.tiandaomoniqi.mm.MainActivity");
}
public void httpGetRespone(ClientResponse cli)
{
string prepayid = JsonUtility.FromJson<infoTest>(cli.message).Result.prepayid;
string packagem = JsonUtility.FromJson<infoTest>(cli.message).Result.package;
string noncestr = JsonUtility.FromJson<infoTest>(cli.message).Result.noncestr;
string timestamp = JsonUtility.FromJson<infoTest>(cli.message).Result.timestamp;
string sign = JsonUtility.FromJson<infoTest>(cli.message).Result.sign;
jo.Call("WeixinPay", prepayid, packagem, noncestr, timestamp, sign);
}
说明一下流程,前面也说过客户端需要把一些商品信息(ID 数量 价格)什么的传给服务器,具体服务器要什么
你就传什么就好了。然后服务器会请求微信预支付接口返回一些信息再返回到客户端,我们去接收,具体有什么
不一定,但是上面这五个参数必须要有,必须的!!!,然后我们用这五个参数去调用我们自己写的方法
jo.Call("WeixinPay", prepayid, packagem, noncestr, timestamp, sign);
上面就是一些核心代码,我是在场景中用一个button去请求购买商品接口来测试的!大部分流程就这些,还有一些小细节就可以打包了
keystore是签名。关于keystore的具体作用我一开始也不太明白,直到看到了这位大佬的描述才理解了keystore在我们应用中的作用,感兴趣的可以仔细看看。其实在安卓工程会有一个默认的keystore,但是如果你的应用上各种平台的话,如果你用的是默认的话是不被允许的,所以我们需要自己创建keystore。创建keystore有许多方法,最常见的就是CMD命令行去创建,网上有许多教程!其实我们unity是有这个创建keystore功能的
创建步骤也不细说啦,网上好多这种文档!ok,到此基本上你就可以打apk包啦!
打完包以后,如果你是按照我的步骤来的,你是可以拉起一次微信支付的,并且支付成功后还可以返回到我们的app内,但是你会发现一个问题,在此购买时会提示购买失败。。。,这个就是你的应用签名的问题了,就是我们最前面说的问题了,我们可以去微信官方去下载一个工具可以获取我们的应用签名官方工具,这是一个apk,安装上手机上就可以了,打开输入包名会看到我们的应用签名,然后到微信开发官网把我们的应用的应用签名绑定这一个就可以了,这里说明一下:
以上就是unity接入微信支付SDK的详细步骤(还差一步验证工作,就是拿你的订单号让服务器去微信官方去验证真实性,这个简单就不说了),我能想起的步骤基本都包含了,一些注意的细节和需要理解东西基本上都涵盖了!其中掺杂着一些个人的理解(仅作参考),有不足之处欢迎大佬指正!!!