关于微信支付这方面的优秀文章已经很多了,所以本篇博客主要介绍一下博主在集成微信支付的时候遇到的一些问题,希望给刚刚接触这方面的开发者一些帮助。因博主能力有限,讲的不对的地方希望大家踊跃指出。另外,祭出博主参考的一些优秀博客。
Android接入微信支付完全解析
http://www.jianshu.com/p/1a17622c9f48
带你走进Android微信支付和支付宝支付服务端操作放到客户端的故事
http://blog.csdn.net/dgs960825/article/details/51959180
首先我们来讲一讲微信支付的流程,这个相信大多数人都已经非常了解了,已经了解的就略过吧~
①app端将商品信息上传给后台服务器,请求生成预支付订单
②后台服务器调用统一下单接口向微信服务器发送请求,微信服务器生成预订单,并生成一个prepay_id返回给后台服务器(这一步也可以在app进行)
③后台服务器将这个prepay_id返回给app端
④用户点击确认支付,app端调用微信SDK打开微信客户端,进行支付
⑤微信客户端向微信服务器发起支付请求并返回支付结果(它们之间交互用的是prepay_id这个参数)
⑥用户输入支付密码后,微信客户端提交支付授权,跟微信服务器交互,完成支付
⑦微信服务器给微信客户端发送支付结果提示,并异步给后台服务器发送支付结果通知
下面就来说一下博主在集成微信支付的时候遇到的坑吧
1、调起微信客户端失败(进入微信客户端之后闪一下就回到自己的app)
这个问题的原因是比较多的,可以根据log日志来一一排查
①首先查看APP_ID、MCH_ID、是否正确
②查看微信开放平台创建应用时所填写的应用包名和应用签名是否正确(注意,签名要提供你打包时使用的keystore文件生成的签名,不会查看签名的小伙伴,这里微信官方提供了一个工具包名检查工具)
③WXPayEntryActivity的创建于注册
微信有两个回调的activity,WXPayEntryActivity和WXEntryActivity,没错,这两个是不一样的,WXPayEntryActivity主要是处理微信支付的回调,WXEntryActivity则是处理其他功能的回调,博主当时在这里就将两个弄混了,下面放出WXPayEntryActivity的正确注册方法
<activity
android: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="wx000000000000"/>//这里要改
</intent-filter>
</activity>
如果你上面这些都没有问题的话,那一般情况下应该就可以支付成功了,接下来就是回调的坑了
下面这个WXPayEntryActivity就是支付之后回调的activity
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_result);
//下面这两句很重要,如果没有将不能回调
api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
api.handleIntent(getIntent(),this);
}
@Override
public void onReq(BaseReq baseReq) {
Log.i("1","onReq");
}
@Override
public void onResp(BaseResp baseResp) {
//在这里处理支付之后的操作,我在这里使用EventBus通知到发起支付的界面
EventBus.getDefault().post(new UserEvent.payWeixinEvent(baseResp.errCode));
finish();
}
}
下面是接收到通知之后的操作
public void onEvent(UserEvent.payWeixinEvent event) {
int code = event.getResultCode();
if (code==0){
//支付成功
MyToast.showToast(this,"支付成功");
setResult(RESULT_OK);
finish();
}else if (code==-1){
//支付失败
MyToast.showToast(this,"支付失败");
}else if (code==-2){
//取消支付
MyToast.showToast(this,"取消支付");
}
}