最近给项目添加微信支付,过程还算顺利,有几个需要注意的地方,特此记录,也方便又需要的童鞋借鉴
首先先去注册开放平台帐号,认证开发者资质。目前是300元一年~申请成功后会给你发封邮件 ,包含下图的信息
这些事可以交给后台去做~
获得以上信息后 咱们客户端要做的事情其实很简单~只要与公司后台交互既可以了
1.SDK下载地址 首先集成SDK到我们的项目当中
2.将微信支付DEMO里的结果回调页面WXPayEntryActivity,还有广播AppRegister 拷贝到我们的项目当中,别忘了还有回调页面的xml也要记得复制哦~~
这里值得特别注意的是 :你需要在项目根目录新建名字为wxapi的包,将WXPayEntryActivity放在wxapi里,然后别忘记去AndroidManifest.xml注册回调页面 和 广播
3:然后你就可以向你公司后台发起微信支付请求,再请求的activity中 ,别忘记AppId注册到微信
api = WXAPIFactory.createWXAPI(this, Constant.APP_ID); api.registerApp(Constant.APP_ID);
对了,记得检查下用户手机是否安装了微信,这里微信SDk也提供了方法
if (isWeiChat) { if (isWXAppInstalledAndSupported()){ //do... }else { ToastUtil.show("您未安装微信"); }
4.向后台发起微信支付申请时,后台会给你返回预支付订单的参数,其中包括appid,预支付订单id....等等之类的
PayReq req = new PayReq(); //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"; // 可选择 Toast.makeText(PayActivity.this, "正常调起支付", Toast.LENGTH_SHORT).show(); // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信 api.sendReq(req);
**:这些参数什么意思,可以去官方开发文档看下,很详细。特别要注意sign参数!这个有点坑。
Sign参数生成规则:
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
- ◆ 参数名ASCII码从小到大排序(字典序);
- ◆ 如果参数的值为空不参与签名;
- ◆ 参数名区分大小写;
- ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
- ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
这个有的公司后台会给你做好,但是有的公司是在客户端做的。所以这些参数你需要和后台商量下,最好是全让他做好,该甩的锅就甩。哈哈
要是后台没给你返回 或者说 给你返回错了【务必用官方的签名工具生成然后与你的对比下】
下面这个方法是,客户端生成二次签名Sign的方法:
SortedMap<Object, Object> parameters = new TreeMap<Object, Object>(); parameters.put("appid", payInfoBean.getAppid()); parameters.put("partnerid", payInfoBean.getPartnerid()); parameters.put("prepayid", payInfoBean.getPrepayid()); parameters.put("noncestr", payInfoBean.getNoncestr()); parameters.put("timestamp", payInfoBean.getTimestamp()); parameters.put("package", payInfoBean.getPackageX()); req.sign = WXStringUtils.createSign("UTF-8", parameters);
public static String createSign(String characterEncoding, SortedMap<Object, Object> parameters) { StringBuffer sb = new StringBuffer(); Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序) Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); Object v = entry.getValue(); if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) { sb.append(k + "=" + v + "&"); } } sb.append("key=" + Constant.API_KEY); String sign = MD5.MD5Encode(sb.toString(), characterEncoding).toUpperCase(); return sign; }
所有参数都OK后 ,将信息塞进去
api.sendReq(req);
5:要想正常调其微信支付,除了所有参数务必正确,注册appid,回调页面正常注册之外,还需要签名打包哦
debug版本是无法发起调起支付的~~~支付的结果会在WxPayEntryActivity中的onResp()方法中
0:成功 -1:失败 -2:取消
不过最好别以这里的结果为准,官方建议~最好是去后台查询具体的支付结果!
----------------------End------------------------