微信android支付好大一个坑

来源:互联网 发布:数据透视表合计排序 编辑:程序博客网 时间:2024/05/05 22:48

微信支付的开发文档真心不敢恭维。看到云来雾里,可能是自己功力不够吧。

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..这样基本上就可以支付走通。

0 0
原创粉丝点击