一、前言
最近刚好有空,把之前微信支付遇到的坑总结了一下。要想在自己的APP中实现APP支付必须申请开通支付功能,这些按着文档来就行啦,我还是直接说android中的问题吧。
一、注意签名
一定要在开放平台为自己的APP配置正确的包名和签名(签名:将APP打一个正式环境的包,然后在微信开放平台下载签名工具进行签名即可)。
一、打包测试
和微信的第三方登录一样,必须要打正式包,不是debug的,来进行测试,这样就没有办法调试了,很麻烦。这里提供一个方法:
在build.gradle文件中设置debug环境和relealse环境的签名相同就可以解决这个问题了,已经试过了,可以使用。
signingConfigs {
/**
* 设置你的keystore相关
*/
debug {
keyAlias 'xxx'
keyPassword 'xxx'
storeFile file('xxx.jks')
storePassword 'xxx'
}
release {
keyAlias 'xxx'
keyPassword 'xxx'
storeFile file('xxx.jks')
storePassword 'xxx'
}
}
接下来按着官网的文档和demo来完成:
1、定义一个全局的变量:
private IWXAPI api;
2、注册APPID
api = WXAPIFactory.createWXAPI(this, "你在微信开放平台创建的app的APPID");
官网是这样注册的,但是,下面要用到msgAPi,我是在Application中初始化。
/**
* 初始化微信登录和支付
*/
public void registerToWX() {
//AppConst.WEIXIN.APP_ID是指你应用在微信开放平台上的AppID,记得替换。
mWxApi = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);
//将该app注册到微信
mWxApi.registerApp(Constants.APP_ID);
}
3、开始支付
当你点击支付的时候去调用服务端的接口(服务端调用统一下单接口,反馈一些信息),所以这里你不能自己独立完成需要后端的支持。
WXPay wxpay = new Gson().fromJson(jsonObj.toString(), WXPay.class);
if (wxpay != null) {
if (!TextUtils.isEmpty(wxpay.getPayparam().getPrepayid())) {
PayReq req = new PayReq();
req.appId = wxpay.getPayparam().getAppid();
req.partnerId = wxpay.getPayparam().getPartnerid();// 微信支付分配的商户号
req.prepayId = wxpay.getPayparam().getPrepayid();// 预支付订单号,app服务器调用“统一下单”接口获取
req.nonceStr = wxpay.getPayparam().getNoncestr();// 随机字符串,不长于32位,服务器生成
req.timeStamp = wxpay.getPayparam().getTimestamp();// 时间戳
req.packageValue = "Sign=WXPay";// 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值
req.sign = wxpay.getPayparam().getSign();//签名
//在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
api.sendReq(req);
//isJump 0默认表示微信部分支付;1表示最后结算,需要跳转
isJump = 1;
mActivity.finish();
}
}
}
4、接下来就是在微信里的一些东西了,我们不用管,我们只需要关心回调页WXPayEntryActivity,这里需要注意该文件必须在wxapi这个文件夹下,及com.xxx.xxx.wxapi.WXPayEntryActivity
//必须实现接口,重写方法
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = ".WXPayEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.pay_result);
api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
//这里就是支付完成后需要做的事,如跳到其他页面等等
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
switch (resp.errCode) {
case 0:
//isJump 0默认表示微信部分支付;1表示最后结算,需要跳转
if (isJump == 1) {
MToast.showToast("支付成功~");
startActivity(new Intent(this, xxxActivity.class);
} else {
MToast.showToast("进度款支付成功~");
}
Log.e("ayao", "微信支付>>>" + resp.errCode);
break;
case -1:
MToast.showToast("支付失败~");
break;
case -2:
MToast.showToast("取消支付~");
break;
default:
}
finish();
}
}
}
5、记得要在功能清单中对Activity中进行注册
<!--微信支付-->
<activity android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
四、总结
其实不管是微信支付还是登陆,按照文档一步一步来,注意事项做好,基本就没什么问题,还有就是根据项目操作。我的项目就是有一个是分段支付,分段支付不需要跳转页面;有一个是最终的结算支付,结算支付完成需要跳转页面,所以需要做点判断。
我是阿耀:
有码走遍天下 无码寸步难行
1024 - 梦想,永不止步!
爱编程 不爱Bug
爱加班 不爱黑眼圈
固执 但不偏执
疯狂 但不疯癫
生活里的菜鸟
工作中的大神
身怀宝藏,一心憧憬星辰大海
追求极致,目标始于高山之巅
一群怀揣好奇,梦想改变世界的孩子
一群追日逐浪,正在改变世界的极客
你们用最美的语言,诠释着科技的力量
你们用极速的创新,引领着时代的变迁
------至所有正在努力奋斗的程序猿们!加油!!
网友评论