这两天,公司APP需要做商城,所以需要接入支付功能。看了一下微信的官方文档,大概知道了流程。首先由服务端集成。集成完之后,客户端这边请求接口,会返回相应的字段,然后客户端拿着这些字段调起微信支付,完成支付。
首先添加微信的依赖
compile'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.1.6'
然后,把demo里的payactivity拷贝过来。下面解释一下payactivity里的代码。
//把APP注册到微信
api= WXAPIFactory.createWXAPI(this,"APPID");
api.registerApp("APPID");
private void pay() {
String url ="your servlet";
Button payBtn = (Button) findViewById(R.id.appay_btn);
payBtn.setEnabled(false);
Toast.makeText(PayActivity.this,"获取订单中...", Toast.LENGTH_SHORT).show();
try{
byte[] buf = Util.httpGet(url);
if(buf !=null&& buf.length>0) {
String content =newString(buf);
Log.e("get server pay params:",content);
JSONObject json =newJSONObject(content);
if(null!= json && !json.has("retcode") ){
PayReq req =newPayReq();
//req.appId = "wxf8b4f85f3a794e77"; // 测试用appId
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(PayActivity.this,"正常调起支付", Toast.LENGTH_SHORT).show();
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
booleanb =api.sendReq(req);
}else{
Toast.makeText(PayActivity.this,"返回错误"+json.getString("retmsg"), Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(PayActivity.this,"服务器请求错误", Toast.LENGTH_SHORT).show();
}
}catch(Exception e){
Toast.makeText(PayActivity.this,"异常:"+e.getMessage(), Toast.LENGTH_SHORT).show();
}
payBtn.setEnabled(true);
}
这个方法就是微信Demo里,payactivity里主要的代码了。这里解释一下代码,url就是服务端集成完之后,给客户端调用的接口地址。会返回appId,parpayId.....拿到这些值给PayReq赋值,然后调用api.sendReq()调起支付。解释完代码,说一下可能遇到的问题。这些返回的参数,服务端是需要进行MD5加密的,如果没有加密,那么客户端拿到这些参数就需要进行加密。
成功调起微信支付后,会跳转到一个界面,这个界面是必须有的,而且必须在wxapi包下。相信做过微信分享的朋友都清楚。
@Override
public void onResp(BaseResp resp) {
if(resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
AlertDialog.Builder builder =newAlertDialog.Builder(this);
builder.setTitle(R.string.app_tip);
builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
builder.show();
}
}
WXPayEntryActivity里代码比较简单,最重要的就是onResp方法了。resp.errCode是返回的错误码,微信给的描述比较模糊。-1的给的是可能的原因,让人摸不着头脑。我在集成的过程中,遇到三次-1。
1,在清单文件中,WXpayEntryActivity没有加filter。
2,签名的问题。在微信后台,我们会填写应用签名,相应的在调起微信支付,也需要用签名一致,而我们在开发的过程中,很可能用的debug的签名,所以也会报-1。
然后就是在调起微信支付的时候,还会有个一个附加的参数extdata。我们在这个界面可以用getIntent().getStringExtra("_wxapi_payresp_extdata");获取在那里传的值。
3,特批支付问题 ,走过很多弯路,正确的步骤是:给子商户邮件申请绑定appid,绑定成功后那个就是下单时的子商户appid,客户端不需要更改注册主商户appid,调起微信支付时appid用子商户