Unity接入微信APP支付(超详细)

Unity接入微信APP支付(超详细)

  • 前言
    • 微信app支付流程
    • 申请权限&配置app信息
    • 导Unity使用的Jar包
        • Android开发环境部署
        • SDK
        • 导出Jar包
        • Unity工程中的Androidmainfest文件
        • untiy导入Jar包
        • untiy调用SDK
        • keystore
        • 应用签名
    • 测试

前言

前文提到的苹果支付刚接完不久,项目又有了新的需求—android手机需要接入微信app支付。。。好吧,研究了微信支付官方的接入文档和官方demo,踩过大大小小无数的坑终于支付成功了!本文主要梳理下自己的工作以备以后不时之需!

微信app支付流程

和前文提到的苹果内购一样,在接微信app支付前我们需要先来大体了解下微信app支付的流程是怎样的:
Unity接入微信APP支付(超详细)_第1张图片

这是微信官方给出的微信APP支付的业务流程,图示已经很详细了,作为前端我们要做的主要就是(2)选择商品下单;(3)请求生成支付订单(9)利用支付参数和SDK 拉起微信支付;以及最后的订单验证(这一步一般都是放在服务器),验证通过后客户端就算购买成功了。我会尽量写详细一些,因为如果以前没有接入SDK的经验,一些简单的细节确实很容易让你浪费好多的时间(哈,我自己就是-_-||)

申请权限&配置app信息

首先我们需要到https://pay.weixin.qq.com微信官方支付平台申请账号支付权限(需要提交一些申请资料然后等待1-3天通过审核,因为这个是公司策划申请的我也不太清除其中细节,估计都是些按部就班的步骤,所以就不一一细说了),申请过后你就可以注册自己的应用了,注册成功通过审核后你的app信息会包含一些很重要的信息;AppID,AppSecret(这个我们客户端用不到,这个服务器请求微信的预支付订单用到的),当然有个界面非常重要:Unity接入微信APP支付(超详细)_第2张图片
这个应用包名需要和你的unity的packname一致,而且应用签名不要随便填,这个需要微信给的工具测出来的,上面的一些信息我会在后面详细的说怎么用的!

导Unity使用的Jar包

Android开发环境部署

这里我是使用的Eclipse打的jar包,这里你首先需要把你的Android开发环境部署好,可以去参考这位大佬的文档,这里记录一下我碰见的一个坑,因为我电脑上同时安装了AndroidStudio和Eclipse,所以在部署ADT的时候SDK启动闪退,查了很多资料发现这是因为AndroidStudio和Eclipse同时使用了一个SDK,AndroidStudio这个软件会把使用的SDK里面的一些目录文件结构破毁掉,导致Eclipse识别不了启动失败,这里建议不要同时安装上述两个软件,如果非要使用可以复制两个SDK,分开使用就可以了,最后莫得办法我只好花费了一上午重新安装下SDK,问题解决!

SDK

这里首先你要有一定的Unity和Android交互的基础,网上有许多交互的小例子可以自行百度下(一定要先学会交互在尝试接入sdk,这很重要,会让少走很多弯路),不过大部分都只是罗列出来一堆代码,只能让人知其然不知其所以然,有时间我会记录一下详细的unity和android交互的文档,下文中我也会在一些细节上详细标注下。
为了方便我们可以去微信支付官网去把他的DEMO下载下来然后根据需求去修改就可以了,当然了一般接入SDK有两种方式第一种是把我们的项目导出一个安卓工程放在eclipse接入,还有一种是在eclipse导出我们做好的jar包在unity使用(这两种方式第一种适合项目的SDK二次开发,第二种比较简单直接),这里我是使用的第二种方式,下载下来Demo会有许多错误,基本上都是缺少类库,把相应的类库添加上就好了,Demo大概是这种结构:Unity接入微信APP支付(超详细)_第3张图片
Demo里面有其他的一些功能,我们只接入微信支付,所以可以把其他的功能干掉,当然了下面代码我都是用最简洁的方式去实现功能便于理解,可以参考一下我的目录:
Unity接入微信APP支付(超详细)_第4张图片
其中MainActivity是我自己创建的继承UnityPlayerActivity的一个类(会交互的应该都知道。。。),LogUtil是一个工具类不用管,然后就可以在这基础上修改了,enmmm挨个来看吧,其中掺杂着一些个人的理解(仅作参考),先来看AppRegister类:
Unity接入微信APP支付(超详细)_第5张图片
这个类不需要改动,这个类是把你的AppID注册到微信应用,没有其他的作用。
Constants类:Unity接入微信APP支付(超详细)_第6张图片
这个类就是一个数据类,存储我们的应用AppID,改成自己的AppID就好了,MD5和Util没有什么改动,而且是工具类就不贴图了,我们主要看一下MainActivity,PayActivity,WXPayEntryActivity这三个核心功能类;
Unity接入微信APP支付(超详细)_第7张图片
这个就是我们自己创建的类了,当然了这个也是和我们unity交互的核心类,这里面你可以写你自己的交互流程,为了演示方便我就直接用最简单直接的方法了,直接把拉起微信支付的参数传递过来用自定义的WeixinPay方法接收,

(这里说明一下这些参数的来源,这个就是前后端自己商议的接口,前端把商品购买信息传递给后端,后端拿到数据后会根据微信支付官方提供的参数算法访问预支付订单接口,这个接口返回值就包含这些参数,然后会把这些参数传递给前端,你就拿到了!(理解流程就好,这里大部分工作都是后端做的,你只需要接收就好了)
然后我们在方法内去定义生成一个Demo给的一个支付类PayActivity,并且把参数传递过去,然后启动这个类startActivity!
Unity接入微信APP支付(超详细)_第8张图片
这个就是拉起微信支付的类了,很简单也很好理解, 上面在MainActivity方法内传递过来的参数接收后利用微信给出的WXAPIFactory类发送数据!这一步在应用中表现就是跳出你的应用去拉起微信内支付了,也就是说如果你的代码没有问题到了这一步就已经能拉起微信支付了(当然要包括unity的设置内容。。。这个后面说),然后我们来看最后一个类WXPayEntryActivity:Unity接入微信APP支付(超详细)_第9张图片
这个类就是微信支付后的接收类了,我简单改了下官方Demo接收逻辑,这样更好理解,代码中都有注释就不解释了!

至此,微信支付Eclipse端的代码部分全部完成,官方的demo看着听多了,仔细摘取下也就这些代码量,是不是感觉非常简单(我当时鼓捣了好久o(╯□╰)o),

导出Jar包

作为一个小白,因为以前自己没有导过jar包。。。查了查网上这方面的知识非常少而且让人摸不着头脑,所以此处详细说明下导Jar包的步骤供不会的参考下,有这方面经验的可以略过这一步往下看:

  1. 当然导包前要确认你的工程是没有error的,有的话会失败!
  2. 导包前我们需要到Project—Clear 清除一下,建议每次都要clear一下,因为这可以强制重新编译一下我们的工程,排除不必要的错误!
  3. 右键我们的工程—Export—(选择Java文件下的JAR file)Next—4
  4. 这里就要注意了,我们要把一些不重要的文件排除掉,可以参考下面:Unity接入微信APP支付(超详细)_第10张图片
    嗯,点击finish就可以在你的导出路径看到Jar包了
    这里说明一下:上面的libs文件夹有两种处理方式:
    【1】 可以直接勾选打进jar里面
    【2】 可以直接把文件拖进unity的Android文件底下!
    不过这里建议用第二种方法,因为公司大佬说第一种方式不容易排除并解决由于类库的重复导致的打包问题,所以选第一种好了!!!
    导出的jar包放进我们unity项目中Android文件底下,当然了如果项目中第一此接入SDK可以直接把Androidmainfest文件也复制到android路径下,感觉关于Androidmainfest这个文件一开始接触的时候也有许多疑问,所以下面会详细梳理下我对androidmainfest这个文件的理解!

Unity工程中的Androidmainfest文件

首先看一下官方的解释:
AndroidManifest官方解释是应用清单(manifest意思是货单),每个应用的根目录中都必须包含一个,并且文件名必须一模一样。这个文件中包含了APP的配置信息,系统需要根据里面的内容运行APP的代码,显示界面。
androidmainfest的作用:

  • 为应用的 Java 软件包命名。软件包名称充当应用的唯一标识符。
  • 为应用的 Java 软件包命名。软件包名称充当应用的唯一标识符。
  • 描述应用的各个组件,包括构成应用的 Activity、服务、广播接收器和内容提供程序。它还为实现每个组件的类命名并发布其功能,例如它们可以处理的 Intent 消息。这些声明向 Android 系统告知有关组件以及可以启动这些组件的条件的信息。
  • 确定托管应用组件的进程。
  • 声明应用必须具备哪些权限才能访问 API 中受保护的部分并与其他应用交互。还声明其他应用与该应用组件交互所需具备的权限
  • 列出 Instrumentation类,这些类可在应用运行时提供分析和其他信息。这些声明只会在应用处于开发阶段时出现在清单中,在应用发布之前将移除。
  • 声明应用所需的最低 Android API 级别
  • 列出应用必须链接到的库**

上面就是官方的解释,通俗来讲就是定义应用的包名 开启应用的手机权限。这是一个xml文件,详细的元素属性可以参考这位大佬的文档,我主要说一下untiy中的androidmainfest,首先这个文件是可以存在多个的,只要放在android文件下就是合法的,打包时你需要注意你的packname和androidmainfest文件中要一致,sdk版本号要一致,要有一个main入口,其它的可以看上面的文档去限定就可以啦。

这里说明一下:在你build之后和关闭unity之前的这段周期内,unity会把你所有的androidmainfest文件整合在下面这个路径中,可以自己查看一下Unity接入微信APP支付(超详细)_第11张图片
嗯,在此贴出来我的文件,大家自行替换相关参数就可以了!

<?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>

untiy导入Jar包

导入jar包基本没有什么注意的,直接拖进去就可以了,大概这样Unity接入微信APP支付(超详细)_第12张图片
这里说一下几个小坑:

  1. libs文件是从android工程那copy过来的,一定不要忘(如果是第二种方式),当时作者就犯了这一个常识性的错误导致打出的apk运行后一交互就奔溃,找了好久最后查看apk的奔溃日志发现微信支付的一个类库找不到…( ̄□ ̄||)
  2. androidmainfest一定要在android直接目录下,其他路径无效!
    其他应该没啥问题了,嗯有问题欢迎一起讨论。

untiy调用SDK

嗯,这里本来想贴出全部代码的,但看了看因为我通信是用的公司的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。创建keystore有许多方法,最常见的就是CMD命令行去创建,网上有许多教程!其实我们unity是有这个创建keystore功能的Unity接入微信APP支付(超详细)_第13张图片
创建步骤也不细说啦,网上好多这种文档!ok,到此基本上你就可以打apk包啦!

应用签名

打完包以后,如果你是按照我的步骤来的,你是可以拉起一次微信支付的,并且支付成功后还可以返回到我们的app内,但是你会发现一个问题,在此购买时会提示购买失败。。。,这个就是你的应用签名的问题了,就是我们最前面说的问题了,我们可以去微信官方去下载一个工具可以获取我们的应用签名官方工具,这是一个apk,安装上手机上就可以了,打开输入包名会看到我们的应用签名,然后到微信开发官网把我们的应用的应用签名绑定这一个就可以了,这里说明一下:

  1. 修改后是可以立即生效的,不需要等待;
  2. 我们需要卸载我们手机上的微信app,然后重新装(清除缓存不管用,嗯,我的是这样)
    然后就可以无限购买了!

测试

Unity接入微信APP支付(超详细)_第14张图片
Unity接入微信APP支付(超详细)_第15张图片
Unity接入微信APP支付(超详细)_第16张图片
Unity接入微信APP支付(超详细)_第17张图片

以上就是unity接入微信支付SDK的详细步骤(还差一步验证工作,就是拿你的订单号让服务器去微信官方去验证真实性,这个简单就不说了),我能想起的步骤基本都包含了,一些注意的细节和需要理解东西基本上都涵盖了!其中掺杂着一些个人的理解(仅作参考),有不足之处欢迎大佬指正!!!

你可能感兴趣的:(学习)