利用activity-alies解决微信支付的包名WXPayEntryActivity不一致问题
Posted CrazyApes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用activity-alies解决微信支付的包名WXPayEntryActivity不一致问题相关的知识,希望对你有一定的参考价值。
总结之前的一些资料
本文:https://www.jianshu.com/p/2b516efb8dee
文章目录
前言
在集成微信支付的过程中,WXPayEntryActivity 类要求必须放在 包名+wxapi 路径下,否则是无法成功回调的。
4、支付结果回调 (引自微信支付文档)
参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。
这对于一些中间件的开发或者一些特殊SDK的单独封装很不友好,毕竟不会对单一应用使用,可能涉及到多种包名的情况。
之前看文档的时候,了解过activity-alies的一些资料,一般用于桌面应用的快捷入口。如果你了解的话,会发现也非常适用于微信支付的WXPayEntryActivity设置。
解决方案
先敲定解决方案,想了解内容的,接着往下看。
WXPayEntryActivity类
我们假设不知道主体包名,随意定义WXPayEntryActivity类到com.modules.pay.wxapi
下。当然,也可以是其它任意位置,这里仅以此为例。
package com.modules.pay.wxapi;
public class WXEntryActivity extends WXCallbackActivity
...
package com.modules.pay.wxapi;
public class WXPayEntryActivity extends ...
...
Manifest声明
利用中的属性设置相关内容
- name 标签设置别名
利用$applicationId
直接指向目标包名
android:name="$applicationId.wxapi.WXPayEntryActivity"
- targetActivity 标签指向目标Activity
比如我们声明的WXPayEntryActivity在com.modules.pay.wxapi
下
android:targetActivity="com.modules.pay.wxapi.WXPayEntryActivity"
- 其它属性根据实际需要设置即可
例如exported属性还是要设置为true的,否则无法被微信调起。
<manifest ...>
<application>
<!-- 原始声明要早于别名声明 -->
<activity
android:name="com.modules.pay.wxapi.WXPayEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="wx..." />
</intent-filter>
</activity>
<!-- 原始声明要早于别名声明 -->
<activity
android:name="com.modules.pay.wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!-- 别名声明 -->
<activity-alias
android:name="$applicationId.wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:targetActivity="com.modules.pay.wxapi.WXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!-- 别名声明 -->
<activity-alias
android:name="$applicationId.wxapi.WXPayEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:targetActivity="com.modules.pay.wxapi.WXPayEntryActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="wx..." />
</intent-filter>
</activity-alias>
</application>
</manifest>
activity-alies
以下为拓展知识了,想了解的可以继续看看。
<activity-alias
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:targetActivity="string" >
. . .
</activity-alias>
- 说明
Activity 的别名,由targetActivity
属性命名。
目标必须与别名在同一应用中,并且在清单中必须在别名之前进行声明。
别名将目标 Activity 呈现为独立实体。它可以具有自己的一组 Intent 过滤器,这些 Intent 过滤器(而不是目标 Activity 本身的 Intent 过滤器)决定了哪些 Intent 可以通过别名激活目标,以及系统如何处理别名。例如,别名的 Intent 过滤器可以指定 android.intent.action.MAIN 和 android.intent.category.LAUNCHER 标志,以使其呈现在应用启动器中,即使目标 Activity 本身的任何过滤器都未设置这些标志。
除了targetActivity
之外,<activity-alias>
属性是 属性的子集。对于子集中的属性,为目标设置的任何值都不会沿用于别名。不过,对于不在子集中的属性,为目标 Activity 设置的值也会应用于别名。 - android:name
别名的唯一名称。该名称应类似于完全限定类名。但是,与目标 Activity 的名称不同,别名名称是任意的,它不引用实际类。 - android:targetActivity
可通过别名激活的 Activity 的名称。此名称必须与清单中别名前面的 元素的 name 属性匹配。 - android:enabled
系统是否可以通过此别名实例化目标 Activity。如果可以,则设为“true”;如果不能,则设为“false”。默认值为“true”。
元素具有自己的 enabled 属性,该属性适用于所有应用组件,包括 Activity 别名。 和 属性必须都设为“true”,系统才能通过别名实例化目标 Activity。如果其中任一属性设为“false”,则别名不起作用。 - android:exported
其他应用的组件是否可以通过此别名启动目标 Activity。如果可以,则设为“true”;如果不能,则设为“false”。如果设为“false”,则只有与别名在同一应用中的组件或具有同一用户 ID 的应用的组件可以通过别名启动目标 Activity。
默认值取决于别名是否包含 Intent 过滤器。没有任何过滤器表示只有指定别名的确切名称才能通过别名调用 Activity。这意味着别名仅供应用内部使用(因为其他应用不知道其名称),所以默认值为“false”。另一方面,至少存在一个过滤器意味着别名供外部使用,所以默认值为“true”。
参考文献
<activity-alies> 谷歌文档
微信支付 App文档
以上是关于利用activity-alies解决微信支付的包名WXPayEntryActivity不一致问题的主要内容,如果未能解决你的问题,请参考以下文章
利用activity-alies解决微信支付的包名WXPayEntryActivity不一致问题
解决Hbuilder打包的APP微信支付时无法唤起支付,且提示{“code“:-100,“message“:“[payment微信:-1]General errors“}的问题