微信支付的开发文档真心不敢恭维。看到云来雾里,可能是自己功力不够吧。
1.导入libammsdk.jar到项目libs
2.定义支付处理Activity这里比较特殊,必须要指定名字和包名,不然支付结果无法回调。具体如下:
在你项目的根目录下创建一个wxapi的子包,例如:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.slimo.wxpay"
android:versionCode="1"
android:versionName="1.1.0" >
此时你的项目包名为:com.slimo.wxpay
那么就要在创建一个com.slimo.wxpay.wxapi的包。
然后在创建一个实现IWXAPIEventHandler接口的Activity:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler
{
IWXAPI wxApi;
private void initWxPay()
{
//初始化微信
wxApi=WXAPIFactory.createWXAPI(this, WxConstants.WxAppId);
wxApi.registerApp(WxConstants.WxAppId);
}
@Override
public void onReq(BaseReq arg0) {
// TODO Auto-generated method stub
LogUtil.e("wxpay onReq:"+arg0);
}
/***
支付结果回调方法(只有登录了微信,才会返回回调此方法,如果没有登录微信,直接放弃支付是不会回调这个方法)
***/
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
break;
default:
break;
}
}
//记得添加这个方法,为了能在支付结束之后回到当前程序的时候激活微信回调(处理微信支付返回的intent)
IWXAPI wxApi;
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
wxApi.handleIntent(intent, this);
}
}
3.支付处理Activity 配置
<activity
android:name="com.slimo.wxpay.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="slimo"/><!-- appid-->
</intent-filter>
</activity>
4.支付接口请求,这里的坑还是比较多,不注意就容易出错,如果参数传入不对将会无法弹出支付界面,但是代码不会提示任何错误。会在回调onResp中提示错误
为了方便说明,先贴一下代码:
TreeMap<String, String> dataMap=new TreeMap<>();
String nonceStr=WxUtils.getNoncestr();
String timeStamp=WxUtils.getTimeStamp();
dataMap.put("appid", WxConstants.WxAppId);
dataMap.put("partnerid", WxConstants.WxParterId);
dataMap.put("prepayid", prepayId);
dataMap.put("package","Sign=WXPay");
dataMap.put("noncestr",nonceStr);
dataMap.put("timestamp",timeStamp);
String sign=WxUtils.getWxSignStr(dataMap, WxConstants.WxKey);
PayReq request = new PayReq();
request.appId = WxConstants.WxAppId;
request.partnerId = WxConstants.WxParterId;
request.prepayId= prepayId;
request.packageValue = "Sign=WXPay";
request.nonceStr=nonceStr;
request.timeStamp= timeStamp;
request.sign= sign;
boolean flag=wxApi.sendReq(request);
说明:以为签名是要按照字典排序,所以直接treeMap。注意上面的字段package与packageValue.还有就是进去签名的可以都是小写,不小心很容易和传的变量名混淆。
5..这样基本上就可以支付走通。