Android实现微信支付功能

jerry Android 2016年03月10日 收藏

开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单、第二步生成微信支付参数、第三步调起微信APP支付。除了需要审核通过的APP应用外,还需要获得微信支付接口权限,然后获取对应的商户号、API密钥,这两者缺一不可,并且在APP微信支付中使用

获得商户号、API密钥

在微信开放平台中查看审核通过的APP应用,是否申请支付功能,若已申请,登录微信支付|商户平台:http://pay.weixin.qq.com 查看对应的商户号、API密钥

》申请微信支付接口

》登录商户平台

》查看商户号

》获取API密钥

第一步:生成预支付订单

将商品信息、商户信息使用BasicNameValuePair存放,然后存储在List列表中,并构造成xml字符串格式,以POST方式微信提供的接口:https://api.mch.weixin.qq.com/pay/unifiedorder 发送数据,接收返回信息,获取prepay_id预支付订单编号

》生成订单请求

  1. private String genProductArgs() {
  2. StringBuffer xml = new StringBuffer();
  3. try {
  4. String nonceStr = genNonceStr();
  5. xml.append("</xml>");
  6. List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
  7. packageParams
  8. .add(new BasicNameValuePair("appid", Constants.APP_ID));
  9. packageParams.add(new BasicNameValuePair("body", "weixin"));
  10. packageParams
  11. .add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
  12. packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
  13. packageParams.add(new BasicNameValuePair("notify_url",
  14. "http://121.40.35.3/test"));
  15. packageParams.add(new BasicNameValuePair("out_trade_no",
  16. genOutTradNo()));
  17. packageParams.add(new BasicNameValuePair("spbill_create_ip",
  18. "127.0.0.1"));
  19. packageParams.add(new BasicNameValuePair("total_fee", "1"));
  20. packageParams.add(new BasicNameValuePair("trade_type", "APP"));
  21. String sign = genPackageSign(packageParams);
  22. packageParams.add(new BasicNameValuePair("sign", sign));
  23. String xmlstring = toXml(packageParams);
  24. return xmlstring;
  25. } catch (Exception e) {
  26. Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage());
  27. return null;
  28. }
  29. }

》获取预支付订单编号

  1. String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");
  2. String entity = genProductArgs();
  3. Log.e("orion", entity);
  4. byte[] buf = Util.httpPost(url, entity);
  5. String content = new String(buf);
  6. Log.e("orion", content);
  7. Map<String, String> xml = decodeXml(content);

第二步:生成微信支付参数

appId对应APP应用的APPID,partnerId对应商户号,prepayId对应第一步获得的预支付订单,packageValue取值Sign=WXPay,nonceStr是一串随机数,timeStamp生成的时间戳,sign对应APP签名

》支付参数配置

  1. private void genPayReq() {
  2. req.appId = Constants.APP_ID;
  3. req.partnerId = Constants.MCH_ID;
  4. req.prepayId = resultunifiedorder.get("prepay_id");
  5. req.packageValue = "Sign=WXPay";
  6. req.nonceStr = genNonceStr();
  7. req.timeStamp = String.valueOf(genTimeStamp());
  8. List<NameValuePair> signParams = new LinkedList<NameValuePair>();
  9. signParams.add(new BasicNameValuePair("appid", req.appId));
  10. signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
  11. signParams.add(new BasicNameValuePair("package", req.packageValue));
  12. signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
  13. signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
  14. signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
  15. req.sign = genAppSign(signParams);
  16. sb.append("sign\n" + req.sign + "\n\n");
  17. show.setText(sb.toString());
  18. Log.e("orion", signParams.toString());
  19. }

 》nonceStr随机数

  1. private String genNonceStr() {
  2. Random random = new Random();
  3. return MD5.getMessageDigest(String.valueOf(random.nextInt(10000))
  4. .getBytes());
  5. }

》timeStamp时间戳

  1. private long genTimeStamp() {
  2. return System.currentTimeMillis() / 1000;
  3. }

》APP签名

  1. private String genAppSign(List<NameValuePair> params) {
  2. StringBuilder sb = new StringBuilder();
  3. for (int i = 0; i < params.size(); i++) {
  4. sb.append(params.get(i).getName());
  5. sb.append('=');
  6. sb.append(params.get(i).getValue());
  7. sb.append('&');
  8. }
  9. sb.append("key=");
  10. sb.append(Constants.API_KEY);
  11. this.sb.append("sign str\n" + sb.toString() + "\n\n");
  12. String appSign = MD5.getMessageDigest(sb.toString().getBytes())
  13. .toUpperCase();
  14. Log.e("orion", appSign);
  15. return appSign;
  16. }

第三步:调起微信APP支付

支付之前,需要手机安装微信客户端,如果没有,会提示下载安装微信,然后再调起支付,在AndroidManifest.xml文件中添加如下配置

  1. <activity
  2. android:name=".act.PayActivity"
  3. android:exported="true"
  4. android:launchMode="singleTop" >
  5. <intent-filter>
  6. <action android:name="android.intent.action.VIEW" />
  7. <category android:name="android.intent.category.DEFAULT" />
  8. <data android:scheme="wxf2f565574a968187" />
  9. </intent-filter>
  10. </activity>

》调起微信支付

  1. private void sendPayReq() {
  2. msgApi.registerApp(Constants.APP_ID);
  3. msgApi.sendReq(req);
  4. }

接收微信返回结果

在实现了IWXAPIEventHandler接口的Activity中重写onResp(BaseResp)方法,接收微信结果

》接收支付结果

  1. public void onResp(BaseResp resp) {
  2. Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
  3. if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
  4. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  5. builder.setTitle(R.string.app_tip);
  6. builder.setMessage(getString(R.string.pay_result_callback_msg,
  7. resp.errStr + ";code=" + String.valueOf(resp.errCode)));
  8. builder.show();
  9. }
  10. }

以上就是本文的全部内容,希望对大家的学习有所帮助。