在个人项目中尚未接入这个功能的时候就据说微信支付的接口很坑爹,用完以后发现别人说的一点也没有错,蛋疼归蛋疼,该用仍是要用。在这里把遇到的问题记录一下以避免之后须要再次介入的话碰到问题浪费时间。android
微信支付流程及注意事项
1.后台设置:在微信开放平台申请开发应用,得到APP-ID
2.引入微信支付SDK
3.在你须要支付的页面注册微信APP-ID,通常在oncreat里,代码以下
wxApi = WXAPIFactory.createWXAPI(mContext, APP_ID, true);
wxApi.registerApp(APP_ID);
4.调用支付接口:
/**
* 微信支付业务
*/
private void wxPay(String result) {
Toast.makeText(mContext, "获取订单中...", Toast.LENGTH_SHORT).show();
try {
org.json.JSONObject json = new org.json.JSONObject(result);
if (null != json && !json.has("retcode")) {
PayReq req = new PayReq();
req.appId = json.getString("appid");
req.partnerId = json.getString("partnerid");
req.prepayId = json.getString("prepayid");
req.nonceStr = json.getString("noncestr");
req.timeStamp = json.getString("timestamp");
req.packageValue = json.getString("package");
req.sign = json.getString("sign");
req.extData = "app data"; // optional
Toast.makeText(mContext, "正常调起支付", Toast.LENGTH_SHORT).show();
wxApi.sendReq(req);
} else {
Log.d("PAY_GET", "返回错误" + json.getString("retmsg"));
Toast.makeText(mContext, "返回错误" + json.getString("retmsg"), Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Log.e("PAY_GET", "异常:" + e.getMessage());
Toast.makeText(mContext, "异常:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
(方法的构造函数result为支付订单所须要的json数据)
5.获取微信支付的返回结果(返回结果码0为成功,-1为失败,-2为取消支付)
须要注意的是微信支付的返回结果只能用WXPayEntryActivity类来接受收,且该类的包名为:你的主包名.wxapi.WXPayEntryActivity
例如你的主包名为com.wxpay则该类的路径为:com.wxpay.wxapi.WXPayEntryActivity(必须这样作,不然接收不到返回结果)
注册到Manifest中
<activity
android:name="你的主包名.wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
该类的代码以下:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.empty);
api = WXAPIFactory.createWXAPI(this, "你的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) {
int errCord = resp.errCode;
//这里接收到了返回的状态码能够进行相应的操做,若是不想在这个页面操做能够把状态码存在本地而后finish掉这个页面,这样就回到了你调起支付的那个页面
//获取到你刚刚存到本地的状态码进行相应的操做就能够了
}
}
}
PS:若是什么都对了返回的状态码仍是-1也就是支付失败,能够清空你手机上的微信的缓存再试试json