转载一下我chen哥的博客
Unity接入微信APP支付(超详细)
前言
微信app支付流程
申请权限&配置app信息
导Unity使用的Jar包
Android开发环境部署
SDK
导出Jar包
Unity工程中的Androidmainfest文件
untiy导入Jar包
untiy调用SDK
keystore
应用签名
测试
前言
前文提到的苹果支付刚接完不久,项目又有了新的需求—android手机需要接入微信app支付。。。好吧,研究了微信支付官方的接入文档和官方demo,踩过大大小小无数的坑终于支付成功了!本文主要梳理下自己的工作以备以后不时之需!

微信app支付流程
和前文提到的苹果内购一样,在接微信app支付前我们需要先来大体了解下微信app支付的流程是怎样的:

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

申请权限&配置app信息
首先我们需要到https://pay.weixin.qq.com微信官方支付平台申请账号支付权限(需要提交一些申请资料然后等待1-3天通过审核,因为这个是公司策划申请的我也不太清除其中细节,估计都是些按部就班的步骤,所以就不一一细说了),申请过后你就可以注册自己的应用了,注册成功通过审核后你的app信息会包含一些很重要的信息;AppID,AppSecret(这个我们客户端用不到,这个服务器请求微信的预支付订单用到的),当然有个界面非常重要:
这个应用包名需要和你的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大概是这种结构:

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包。。。查了查网上这方面的知识非常少而且让人摸不着头脑,所以此处详细说明下导Jar包的步骤供不会的参考下,有这方面经验的可以略过这一步往下看:

当然导包前要确认你的工程是没有error的,有的话会失败!
导包前我们需要到Project—Clear 清除一下,建议每次都要clear一下,因为这可以强制重新编译一下我们的工程,排除不必要的错误!
右键我们的工程—Export—(选择Java文件下的JAR file)Next—4
这里就要注意了,我们要把一些不重要的文件排除掉,可以参考下面:

嗯,点击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文件整合在下面这个路径中,可以自己查看一下
嗯,在此贴出来我的文件,大家自行替换相关参数就可以了!

<?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-sdkandroid: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"/><applicationandroid:label="@string/app_name" ><activityandroid: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><activityandroid:name="包名.PayActivity"android:configChanges="orientation|keyboardHidden|screenSize"android:screenOrientation="behind"android:theme="@android:style/Theme.Translucent.NoTitleBar"><!--android:launchMode="singleTop">--></activity><activityandroid: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><receiverandroid:name=".AppRegister"><intent-filter><action android:name="包名.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" /></intent-filter></receiver></application>
</manifest>

untiy导入Jar包
导入jar包基本没有什么注意的,直接拖进去就可以了,大概这样

这里说一下几个小坑:

libs文件是从android工程那copy过来的,一定不要忘(如果是第二种方式),当时作者就犯了这一个常识性的错误导致打出的apk运行后一交互就奔溃,找了好久最后查看apk的奔溃日志发现微信支付的一个类库找不到…( ̄□ ̄||)
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功能的

创建步骤也不细说啦,网上好多这种文档!ok,到此基本上你就可以打apk包啦!

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

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

以上就是unity接入微信支付SDK的详细步骤,我能想起的步骤基本都包含了,一些注意的细节和需要理解东西基本上都涵盖了!其中掺杂着一些个人的理解(仅作参考),有不足之处欢迎大佬指正!!!

https://blog.csdn.net/RYC4612123/article/details/93509616

unity 微信支付相关推荐

  1. Unity微信支付,IOS提示支付签名验证失败。安卓没问题

    最近手上有一个Unity项目,Java后台,原作者跑路,我们属于半路上车. 打包ipa的时候碰到了很多问题. 在原来项目的基础上引入了微信支付体系. 安卓支付流程没有出问题,但是到了IOS这里,千辛万 ...

  2. unity接入微信支付完成切换前台游戏闪退

    最近刚搞定微信支付的功能,然后支付完返回游戏又发生闪退,经过一些调试,最后确认是横竖屏切换导致的,游戏从竖屏切换回横屏的时候设置了一个错误的分辨率,特别大的那种,然后内存溢出就崩溃了,目前还不知道为什 ...

  3. unity iOS 微信支付 教程

    时间:2018.6 Unity版本:5.6.2 平台:Unity+iOS 微信SDK版本:2018.6月 1.8.2版本 适用人群:unity 开发,oc基础较弱 食用前提:请确保已经清楚官方的整个支 ...

  4. Unity接入微信支付SDK

    最近1年转了UE开发,博客更新的比较少,技术栈宽了不少,以后有空尽量多更新,也方便总结记忆 Unity接入微信支付整个过程坑比较多,网上之前的教程要么比较老,要么比较零碎,只能东拼西凑摸索,跑通后还是 ...

  5. Unity接入iOS微信支付

    最近因为公司项目需求,需要做iOS的位置支付,所谓初生牛犊不怕虎,博主直接二话不说就像二愣子一样的直接上手做了,虽然之前知道iOS使用OC(object-c)做的开发,到了真正接触了才发现,o my ...

  6. laravel ajax vue6,详解用vue.js和laravel实现微信支付

    注:此项是微信公众号开发,请在往下看之前,先实现网页微信授权登陆功能,具体参看我简书的另一篇文章:https://www.jb51.net/article/117004.htm 1.打开app/con ...

  7. 【全网唯一】全网唯一能够跑通的,跑不通你来找我~用node.js完成微信支付下单功能,且只需要一个文件wxpay.js就解决业务流程的node.js程序

    先吐为敬! 最近心血来潮研究nodejs如何完成微信支付功能,结果网上一搜索,一大堆"代码拷贝党"."留一手"."缺斤少两"."不 ...

  8. 解决Hbuilder打包的APP微信支付时无法唤起支付,且提示{“code“:-100,“message“:“[payment微信:-1]General errors“}的问题

    依次排查: 1.menifest.json中配置了微信的appid是不是微信开放平台(微信开放平台)对应的APP id,包名是否和微信开放平台对应APP的包名一致(com.******.app) 2. ...

  9. 微信支付invalid total_fee 的报错

    因为我的测试商品是0.01的 原因是微信支付的金额是不能带小数点的 直接在提交的时候 乘以 100操作 ,因为里面设置参数的时候是 以分为单位的 [packageParams setObject: p ...

最新文章

  1. leetcode 287. 寻找重复数(Find the Duplicate Number)
  2. 皮一皮:据说烤红薯都是这样的...
  3. CUDA从入门到精通(四):加深对设备的认识
  4. 闭包应用之延迟函数setTimeout
  5. 主成分分析法案例_因子分析案例及操作解析
  6. Jquery 插件集合
  7. 使用火狐的restclient发送http接口post及get请求
  8. Maven的下载、安装和配置
  9. excel生成二维码
  10. 奥城大学计算机专业,2018年美国大学硕士双录取最全名单
  11. 邓俊辉《数据结构》-向量学习笔记
  12. python - TypeError: combat(sume,sumu) missing 2 required positional arguments: sume,sumu
  13. C语言sprintf函数解析(实现数据类型转换到字符串)
  14. 我的年假2016-2017
  15. 201671030123叶虹《英文文本统计分析》结对项目报告
  16. 白皮书:InfiniBand简介
  17. Deep Snake for Real-Time Instance Segmentation:基于Deep Snake的实例实时分割
  18. 在佛山如何找到一个高质量的股票交易API平台?
  19. Firefox+FireBug+YSlow搭建测试web前端性能
  20. javascript判断字符串相等

热门文章

  1. 电脑和树莓派之间传输文件
  2. 郝健: Linux内存管理学习笔记-第4节课
  3. 输入某年某月某日,判断这一天是这一年的第几天?(Python)
  4. Python --- 笑脸检测+口罩人脸识别
  5. 公司要倒闭的6大征兆——集齐任意5个,兑换一次破产清算
  6. Qt XXXr.obj : error LNK2001: 无法解析的外部符号 3 个无法解析的外部命令问题
  7. 【数据库】期末复习:SQL语句、关系代数的运算、范式的定义和判断、求最小函数依赖集、ER图转关系模式
  8. 如何使用LODOP实现合同套打精准打印?
  9. 【短视频运营】短视频剪辑 ① ( 下载软件 | 安装软件 | 简单使用 )
  10. 票据OCR扫描仪-助力财务智能化