android不在坑系列二微信支付-1

来源:互联网 发布:ddos压力测试源码 编辑:程序博客网 时间:2024/05/21 19:30

android不在坑系列二微信支付-1

前言:

后台:我在检查下我写的配置有不有问题….

IOS:我们前台没啥好做的就是把你们给的参数给微信

后台:不应该啊,我在设几个接口拦截一下参数

坑:-1的原因太隐晦,原谅我的不懂

-1原因:检查微信开发者配置信息是否有错,后台检查sign是否加密MD5加密方式不对,前台是否代码写错…

一、躲坑开发版和正式版的签名问题

其实大家在开发中,有各种要配置签名的第三方sdk,如百度地图,微信支付,支付宝支付等等….对于我这种,在公司也工作的,在家也工作的,默认的开发版签名不是一样的,总得去改,so,

1.把签名全都放在父工程下
/project    /key        /debug.keystore        /release.jks
2.编译时候应用文件下的签名

在app的build.gradle的android{}中添加代码

signingConfigs {    release {        keyAlias 'weishangcheng'        keyPassword 'kaisa008'        storeFile file('../key/release.jks')        storePassword 'kaisa008'    }    debug {        keyAlias 'androiddebugkey'        keyPassword 'android'        storeFile file('../key/debug.keystore')        storePassword 'android'    }    buildTypes {        debug {            signingConfig signingConfigs.debug        }        release {            signingConfig signingConfigs.release        }    }}

如果你配置好了android的环境变量也即是android_home,即可使用命令查看sha1

keytool -list -keystore debug.keystore

android默认签名也即是开发版签名密码就是android,开发版的可以参考我写的

ok,做到这一步,然后再去开发者微信平台对一下配置信息基本就排除这里的原因导致-1

2.微信支付配置有点坑爹

后台最后去打电话给微信支付客服,客服叫我们先按照demo,走一遍。

Excuse me,你提供的demo能用么,我导进去还报错,你是多久没维护这东西了

其实微信支付也就是需要demo的一个类和一个jar,同时你需要建立一个工程一级目录建立一个包叫做wxapi,同时把类复制进来

最后在配置文件配置,如下 记得不能用全类名去注册activity,下面代码直接copy

<activity        android:name=".wxapi.WXPayEntryActivity"        android:exported="true"        android:launchMode="singleTop"        android:screenOrientation="portrait"        />

如果你没有受到回调,配置WXPayEntryActivity有问题

3.sign有问题

在我们反复的查看微信支付文档,最后硬气的跟后台说,要写的就那些,没有啥改的,机智的我跟身边的朋友要了下,他们也就是转发了下参数给微信,这个时候不要迟疑,你们MD5加密有问题,怂给后台

这个时候前台需要自己按照文档加密一些sign,很多人就因为这里出问题。

代码如下:

  //联网请求后台,获取必要参数OrderConfirmDao.doWxPay(new onConnectionFinishLinstener() {  @Override public void onSuccess(int code, Object result) {        WxPayModel mWxPayModel = (WxPayModel) result;        Utils.APP_ID = mWxPayModel.appid;        IWXAPI api = WXAPIFactory.createWXAPI(OrderConfirmActivity.this, Utils.APP_ID);        api.registerApp(Utils.APP_ID);        PayReq mPayReq = new PayReq();        mPayReq.appId = Utils.APP_ID;        mPayReq.partnerId = mWxPayModel.partnerid;        mPayReq.prepayId = mWxPayModel.prepayid;        mPayReq.packageValue = "Sign=WXPay";        mPayReq.nonceStr = mWxPayModel.noncestr;        mPayReq.timeStamp = genTimeStamp() + "";        //开始生成sign,按照官方教程        List<NameValuePair> signParams = new LinkedList<NameValuePair>();        signParams.add(new BasicNameValuePair("appid", mPayReq.appId));        signParams.add(new BasicNameValuePair("noncestr", mPayReq.nonceStr));        signParams.add(new BasicNameValuePair("package", mPayReq.packageValue));        signParams.add(new BasicNameValuePair("partnerid", mPayReq.partnerId));        signParams.add(new BasicNameValuePair("prepayid", mPayReq.prepayId));        signParams.add(new BasicNameValuePair("timestamp", mPayReq.timeStamp));        mPayReq.sign =genAppSign(signParams);        api.sendReq(mPayReq);  }  @Override public void onFail(int code, String result) {  }});

获取时间戳

  /**   *  获取时间戳   * @return   */  private long genTimeStamp() {     return System.currentTimeMillis() / 1000;  }

生成sign

  /**   * 生成sign   * @param params   * @return   */  private String genAppSign(List<NameValuePair> params) {        String mAppSign = null;        StringBuilder sb = new StringBuilder();        for (int i = 0; i < params.size(); i++) {          sb.append(params.get(i).getName());          sb.append('=');          sb.append(params.get(i).getValue());          sb.append('&');        }        sb.append("key=");        sb.append("192da379c62f7edee041abb33c23897b");        try {          mAppSign = MD5.MD5TOE(sb.toString()).toUpperCase();        } catch (Exception mE) {          mE.printStackTrace();        }        return mAppSign;  }

重点来了,大礼包加密类一份,后台很多就因为加密搞错了,才造成sign出错,出现-1错误妈的

public class MD5 {  public static String MD5TOE(String sourceStr) throws UnsupportedEncodingException {        String result ="";        try {          MessageDigest md = MessageDigest.getInstance("MD5");          md.update(sourceStr.getBytes("UTF-8"));          byte b[] = md.digest();          int i;          StringBuffer buf = new StringBuffer("");          for (int offset = 0; offset < b.length; offset++) {            i = b[offset];            if (i < 0)              i += 256;            if (i < 16)              buf.append("0");             buf.append(Integer.toHexString(i));          }          result = buf.toString();          //log.info(“MD5(” + sourceStr + “,16) = ” + buf.toString().substring(8, 24));        } catch (NoSuchAlgorithmException e) {          // log.info(e);        }        return result;          }}  

现在点击微信支付,是不是成功了~~~~

结语:

很多-1是因为sign生成出错了,so,把MD5加密类发给后台,说一句这是我写的加密类,你试试换一个,装一下B,注意了,前台不要生成sign,这很危险的!

0 0
原创粉丝点击