Android应用微信支付功能实现

2015-12-24 23:06 评论 0 条

概要

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

获得商户号、API密钥

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

》申请微信支付接口

001-申请微信支付接口

》登录商户平台

002-登录商户平台

》查看商户号

003-查看商户号

》获取API密钥

004-获取API密钥

005-获取API密钥

第一步:生成预支付订单

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

》生成订单请求

006-生成订单请求

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

》获取预支付订单编号

007-获取预支付订单编号

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

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

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

》支付参数配置

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

》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.   
  4.         for (int i = 0; i < params.size(); i++) {  
  5.             sb.append(params.get(i).getName());  
  6.             sb.append('=');  
  7.             sb.append(params.get(i).getValue());  
  8.             sb.append('&');  
  9.         }  
  10.         sb.append("key=");  
  11.         sb.append(Constants.API_KEY);  
  12.   
  13.         this.sb.append("sign str\n" + sb.toString() + "\n\n");  
  14.         String appSign = MD5.getMessageDigest(sb.toString().getBytes())  
  15.                 .toUpperCase();  
  16.         Log.e("orion", appSign);  
  17.         return appSign;  
  18.     }  

第三步:调起微信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.   
  8.                <category android:name="android.intent.category.DEFAULT" />  
  9.   
  10.                <data android:scheme="wxf2f565574a968187" />  
  11.            </intent-filter>  
  12.        </activity>  

》调起微信支付

008-支付参数配置

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

接收微信返回结果

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

》接收支付结果

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

当前文章价值5.78元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://www.teachcourse.cn/1138.html ,谢谢支持!

资源分享

分类:Android 标签:,
Android开发之HorizontalScrollView控件使用案例介绍 Android开发之HorizontalScro
mysql数据库导出和导入 mysql数据库导出和导入
VirtualSVN Server与TortoiseSVN版本管理工具的简单使用 VirtualSVN Server与Torto
线上产品接入bugly热更新 线上产品接入bugly热更新