您的位置:首页 > 移动开发 > 微信开发

Android微信支付之免jar包集成方式(简单至极)

2015-09-22 18:17 603 查看
如标题,可以不使用微信支付的jar进行微信支付,是不是很高大上,哈哈哈~没错,我今天就是来装逼的….没办法都是被逼的,公司项目需求如此,只好研究下微信支付jar和微信App的源码,而且有App已经实现了,然后再参考下,我就出来装逼了………….

言归正传,首先我们来看下微信支付SDK的jar包,微信支付SDK是怎么调起微信的:

首先我们可以下载微信支付的demo找到微信jar包里面跳转到微信的代码,具体怎么去找微信SDK怎么调起的代码这里不多说啦,直接看代码:

//可以看到全部都是被混淆的代码,不过这并不妨碍我们看明白它的意思

public static boolean a(Context paramContext, a parama)
{
if ((paramContext == null) || (parama == null))
{
com.tencent.mm.sdk.b.a.a("MicroMsg.SDK.MMessageAct", "send fail, invalid argument");
return false;
}
if (c.a(parama.h))
{
com.tencent.mm.sdk.b.a.a("MicroMsg.SDK.MMessageAct", "send fail, invalid targetPkgName, targetPkgName = " + parama.h);
return false;
}
if (c.a(parama.i)) {
parama.i = (parama.h + ".wxapi.WXEntryActivity");
}
com.tencent.mm.sdk.b.a.c("MicroMsg.SDK.MMessageAct", "send, targetPkgName = " + parama.h + ", targetClassName = " + parama.i);
//这里就是intent跳转过去的,可以明显看到它是指定了类的,是什么我们不知道,因为被混淆了,其实这里找到那个类是可以的,但是我们是无法解决数据是怎么封装的,有很大的可能是通过服务器生成的。
Intent localIntent = new Intent();
localIntent.setClassName(parama.h, parama.i);
if (parama.k != null) {
localIntent.putExtras(parama.k);
}
String str = paramContext.getPackageName();
localIntent.putExtra("_mmessage_sdkVersion", 570425345);
localIntent.putExtra("_mmessage_appPackage", str);
localIntent.putExtra("_mmessage_content", parama.j);
localIntent.putExtra("_mmessage_checksum", b.a(parama.j, 570425345, str));
if (parama.flags == -1) {
localIntent.addFlags(268435456).addFlags(134217728);
}
for (;;)
{
try
{
paramContext.startActivity(localIntent);
com.tencent.mm.sdk.b.a.c("MicroMsg.SDK.MMessageAct", "send mm message, intent=" + localIntent);
return true;
}
catch (Exception paramContext)
{
com.tencent.mm.sdk.b.a.a("MicroMsg.SDK.MMessageAct", "send fail, ex = %s", new Object[] { paramContext.getMessage() });
}
localIntent.setFlags(parama.flags);
}
return false;
}


上面大部分代码可以忽略掉,可以看到在利用intent跳转的时候,是添加了class的,至于这个class是什么,我们这里就拿不到了。其实拿是可以到的,但是里面的数据是怎么传递的,传递的是什么类型,就拿不到了,好像到这里就研究不下去了。因为看不到数据结构,就不知道他具体怎么传的值。

本来已经放弃了,后来玩手游时,无意中看见了一个SDK实现了这种微信支付,而且效果跟我们的需求差不多,立马反编译这个SDK看它里面是怎么实现的,我们看代码:

同样只有一段有用的代码,其他代码省去了:

if ((paramView.startsWith("http://")) || (paramView.startsWith("https://")))
{
localIntent = new Intent();
localIntent.setAction("android.intent.action.VIEW");
localIntent.setData(Uri.parse(paramView));
startActivity(localIntent);
return;
}
Intent localIntent = new Intent();
localIntent.setAction("android.intent.action.VIEW");
localIntent.setData(Uri.parse("http://" + paramView));
startActivity(localIntent);


以上就是关键的代码,可以看出,没有指定要跳转到那个activity,但是指定了action和data,那我们就从这两个上面入手,首先看action,然后反编译微信App,如果有action的话,应该是写在配置文件中的,同理data也可以看出来,是uri类型的。

然后我们反编译微信App的APK。

反编译中……

我擦,有点慢啊….

下面是微信App反编译之后的配置文件中的一些activity的配置信息,因为信息太多了,我只把我根据action和data找到对应的activity的配置信息贴出来。

<activity android:configChanges="keyboardHidden|orientation|screenSize" android:exported="false" android:name=".plugin.setting.ui.qrcode.GetQRCodeInfoUI" android:permission="com.tencent.mm.permission.GET_QRCODE_INFO" android:theme="@style/j0">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="weixin.qq.com" android:pathPrefix="/r/" android:scheme="http"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="qr" android:scheme="weixin"/>
</intent-filter>
</activity>


既然activity配置后能收到信息,那么我们也可以配置一个同样的activity来对这个信息进行拦截,从而拿到里面传递的是什么信息,配置同样的activity,然后获取里面intent所附带的信息:

配置相同信息的activity然后进行微信支付时:



我们就可以在android_text里面获取intent的附带信息,如下:

weixin://wap/pay?appid%3Dwx3745712c85e2ac4d%26noncestr%3D50011510081807491189%26package%3DWAP%26prepayid%3Dwx20151008180749b5c540cb310837000029%26sign%3DC1DA3877D2E96F568206AE4C77B370C7%26timestamp%3D1444298869


好从上面,我们可以看到,我们获取到信息,是一串经过加密的uri地址,那么,我们是不是可以让服务器根据微信的支付接口生成这样的地址呢?答案肯定是可以的(至于怎么做让你们后台人员研究下微信接口就出来了),到这里,我们就可以把订单信息发送给微信并进行支付了,而且没有使用微信支付的API。

注意的小伙伴会不会发现一个问题,那就是我们怎么知道支付结果呢?其实做过微信支付或者微信分享的伙伴,会发现集成时,微信会让我们拷贝微信的一个指定名称和指定目录的activity,这个activity就是微信用来进行回调的,正常就是我们从这个activity拿到支付结果,再回调到我们自己的所需要的地方,但是我们走的是不正常渠道,所以这个不行。那么我们要怎么做?其实很简单,想要知道支付结果,直接叫服务端去问微信不就行了吗?关我们客户端半毛钱关系哦…………..

最后提示一点,生成微信支付的uri地址是要用微信的wap支付方式生成,才能打开,如果用微信App接入方式去组合的话,会提示系统繁忙的。

总的来说是比较简单,一步一步分析就可以了,只是没有把怎么寻找这些关键代码的过程贴出来,因为过程比较长,也有点麻烦。主要就是借助这个软件“jd-gui.exe”来进行jar的查询。反编译App用的是这个软件“APK改之理”。有兴趣的朋友可以玩玩。

想自己实现的,按照这个三个问题解决思路,就可以实现的。

总结下,一共有三个问题:

1:怎么调起微信的支付页面?

通过action和data

2:传递什么样的支付信息给微信?

通过配置同样的action和data,然后获取传递的信息。

3:怎么收到支付结果,反馈给用户?

通过服务端的接口访问方式拿到支付结果。

以上就是不使用微信jar包怎么进行微信支付的集成。

哈哈…其实写这个出来,有点怕怕微信把这个入口封了。

这里就不贴demo了,因为唤起微信,并完成支付,需要生成订单信息的,而且订单信息是有时效性的,所以不方便写demo。

有什么错误的地方,或者有大神还有别的方式欢迎留言交流哈….
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android sdk 支付 微信 jar