拿到APPID后,现在Application里去注册:
private static IWXAPI api_;
public static final String WX_APP_ID = "拿到的APPID";
@Override
public void onCreate() {
super.onCreate();
...
api_ = WXAPIFactory.createWXAPI(this, WX_APP_ID);
api_.registerApp(WX_APP_ID);
}
public static IWXAPI getIWXAPI() {
return api_;
}
接下来是创建WXPayEntryActivity:
这部分基本和文档差不多。
import android.annotation.SuppressLint;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
import com.tencent.mm.opensdk.constants.ConstantsAPI;
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.zlxn.dl.yunvjia.R;
import com.zlxn.dl.yunvjia.activity.HomeActivity;
import com.zlxn.dl.yunvjia.app.BaseApplication;
import com.zlxn.dl.yunvjia.base.BaseActivity;
public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler {
private static final String TAG = "WXPayEntryActivity:";
private IWXAPI api_ = BaseApplication.getIWXAPI();
@Override
protected void initView() {
setContentView(R.layout.activity_w_x_pay_entry);
}
@Override
protected void initData() {
super.initData();
api_.handleIntent(getIntent(), WXPayEntryActivity.this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api_.handleIntent(intent, WXPayEntryActivity.this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@SuppressLint("LongLogTag")
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if (resp.errCode == 0) {
Toast.makeText(WXPayEntryActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(WXPayEntryActivity.this, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("flag", 3);
startActivity(intent);
finish();
} else if (resp.errCode == -1) {
Toast.makeText(WXPayEntryActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
finish();
} else if (resp.errCode == -2) {
Toast.makeText(WXPayEntryActivity.this, "您已取消支付", Toast.LENGTH_SHORT).show();
finish();
}
}
}
}
拿到后台返回数据后:
PayReq req = new PayReq();
Log.d("返回数据:", "onSuccess: " + wxBean.appid);
req.appId = wxBean.appid;
req.partnerId = wxBean.partnerid;
req.prepayId = wxBean.prepayid;
req.packageValue = wxBean.packageX;
req.nonceStr = wxBean.noncestr;
req.timeStamp = wxBean.timestamp + "";
req.sign = wxBean.sign;
//req.extData = "app data";
api_.sendReq(req);
此时已基本完事
遇 到 的 一 些 问 题 \color{red}{遇到的一些问题} 遇到的一些问题
- 如果后台返回的是对象的话,可能会有关键词,可以这样:
@SerializedName("package")
public String packageX;
- 如果有Android 11 无反应,可参考文档:
这边AndroidStudio 是4.0.1;
classpath 'com.android.tools.build:gradle:3.6.4'
清单文件放这个
<manifest>
...
<queries>
<!-- com.blankj.utilcode SDK检测虚拟机-->
<intent>
<action android:name="android.intent.action.DIAL" />
</intent>
<!-- 微信支付SDK-->
<package android:name="com.tencent.mm" />
<!-- 支付宝支付SDK-->
<package android:name="com.eg.android.AlipayGphone" />
</queries>
<application>
...
</application>
</manifest>
-
签名需得和所打的正式包一致
签名校验工具就是官方文档的那个:签名工具下载地址
-
一个坑就来了(像极了电脑有问题?重启看看):
这些做完还是无法调起,起先怀疑是测试机是Android 10的问题:
先找同事用Android 6 的测试,第一次通了,但是未付款,在之后就不知道为啥不行了;
再用一个Android 8的测试,没有问题。
然后,继续勾搭Android 10的手机,微信开放社区的回答让人很啼笑皆非。直到在一个博客那里看到个清除微信缓存,说是有订单缓存。
清了后没第一时间去测,是做了下别的功能,回头再测发现通了!!!