接入微信支付相对支付宝支付要麻烦些,它和包名,签名有关。更让人难以理解的是类名和类所在的包名都是规定好的,不能改的,一改你就调不起微信支付。
官方文档地址
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3
包名和应用签名的获取
包名:build.gradle文件中的applicationId而不是AndroidManifest.xml中的package。以后凡是说到包名都是applicationId。
应用签名的获取:因为项目的app都是用360加固的,360加固上在加固应用时在任务详情可以看到,签名md5就是,它是大写的,你弄成小写就是了
如下图:
万一填错了也可以改的,好像要等1天才能修改成功
依赖以及相关配置
在app下build.gradle文件中,添加如下依赖即可
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
在Application中初始化先向微信注册您的APPID
private void initWxPay() {
//初始化微信api
wxapi = WXAPIFactory.createWXAPI(this, WxPayUtils.getWxAppId(), false);
//注册appid
wxapi.registerApp(WxPayUtils.getWxAppId());
}
调起微信支付
示例代码:
public static void wxPay(Context context, final String prepqyId) {
if (MyApplication.getWxapi().isWXAppInstalled()) {
Thread payThread = new Thread() {
@Override
public void run() {
PayReq request = new PayReq();
request.appId = WxPayUtils.getWxAppId();
request.partnerId = WxPayUtils.getWxMchId();
request.prepayId = prepqyId;
request.packageValue = "Sign=WXPay";
request.nonceStr = WxPayUtils.getNumSmallLetter();
request.timeStamp = (System.currentTimeMillis() / 1000) + "";
SortedMap map = new TreeMap();
map.put("appid", request.appId);
map.put("partnerid", request.partnerId);
map.put("prepayid", request.prepayId);
map.put("package", request.packageValue);
map.put("noncestr", request.nonceStr);
map.put("timestamp", request.timeStamp);
request.sign = WxPayUtils.createMD5Sign(map);
MyApplication.getWxapi().sendReq(request);
}
};
payThread.start();
} else {
ToastUtils.show(context.getString(R.string.wx_unInstalled));
}
}
public static String createMD5Sign(SortedMap map) {
StringBuilder sb = new StringBuilder();
Set es = map.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
sb.append(k + "=" + v + "&");
}
String params = sb.append("key=" + getWxSignKey()).substring(0);
String sign = MD5Encode(params, "utf8");
sign = sign.toUpperCase();
return sign;
}
其中getWxAppId是申请的appId,getWxMchId是商户号,在微信支付后面查看详情中可查看
createMD5Sign()方法是接口给的,就是和接口一样的,可以问下服务器端同事。其中getWxsignKey也是接口给或者是申请微信支付的人弄的,它是用来加密各个请求的参数的,它必须和接口用的是一样的。这个我也不知道在那查看
处理支付结果回调
建WXPayEntryActivity类,目录结构示例如下:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = MyApplication.getWxapi();
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) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
//errCode为0是支付成功,其他都是失败
if (resp.errCode == WxPayUtils.PAY_SUCCESS_CODE) {
//支付成功
LogUtils.v("wxpayy", "支付成功");
//去后台查询订单结果
} else {
//支付失败
LogUtils.v("wxpayy", "支付失败");
LogUtils.v("wxpayy", resp.errCode + "/");
//根据错误code排查问题
}
}
finish();
}}
注意
resp.errCode为-1肯定是配置问题,不用怀疑
调不起微信支付问题排查
- 签名的文件是否和申请时的一致,debug时是否用上了签名文件
- appId,商户号,request.sign是否和接口用的一样
- WXPayEntryActivity建的目录结构是否正确,是否真的是该包名路径下建的,类名不能错
换包名该如何修改
1、其实很简单,WXPayEntryActivity类的目录得建对。如下图所示
2、appId,商户号,request.sign得换新的
3、修改applicationId,修改签名文件
如果发现调不起微信支付或者修改包名之后有问题可以私信我