android_app开发微信支付集成

Posted 严少来也

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android_app开发微信支付集成相关的知识,希望对你有一定的参考价值。

最近项目里面需要支付功能,boss一致决定用微信支付,所以在网上查了很多资料,说的不全,完了就找以前的同事指教。算是成功集成上去了。在这里做个总结记录。

1、在APP上集成微信支付,首先当然是当官网上去注册并获取到支付功能。这些不涉及到开发,官网上说的很详细,这里就不多做文章。获取到这些能力了就为开发提供了条件了。开发中会用到的就是平台给的APPID、APPsercet、以及商户平台上设置的APP_key。

2、具备了支付能力等前提条件之后,就是开发过程了。代码里面怎么才能吊起支付了,参照官网上的DEMO自己也做了一些总结和各方大神的指教。分为了下面几个步奏。

(1)、首先当然是将sdk配置进工程环境中,官网中下载Android端SDK,解压后将libmmsdk.jar导入工程,然后将DEMO中Constant.java(这里是参照官方demo的样式写的,当然也可以采用其他方式)、MD5.java、Util.java放入工程(我这里用到了这些),这些先决条件有了之后就可以下一步写代码操作了。

(2)、生成订单信息

生成订单信息采用了如下方法生成,生成订单信息需要签名文件,所以里面包含了生成签名。微信要求所有请求采用XML参数形式,所有生产订单信息之后又需要转换成xml。订单信息需要的请求参数可以到官网上去对照,这里只加入了一些必要的参数。

生成订单信息方法:

[java]  view plain  copy  
  1. //获取产品订单信息  
  2.     private String genProductArgs()   
  3.         StringBuffer xml = new StringBuffer();  
  4.         try   
  5.             String nonceStr = genNonceStr();  
  6.   
  7.             xml.append("</xml>");  
  8.             List<NameValuePair> packageParams = new LinkedList<NameValuePair>();  
  9.   
  10.             packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID)); //APPID  
  11.   
  12.             packageParams.add(new BasicNameValuePair("body""单价:" + singlePrice + " x " + payment_num.getText().toString() + "份"));  //简单描述  
  13.   
  14.             packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));  //商户ID  
  15.   
  16.             packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));   //随机字符串  
  17.   
  18.             packageParams.add(new BasicNameValuePair("notify_url","http://www.weixin.qq.com/wxpay/pay.php")); //通知地址  
  19.   
  20.             packageParams.add(new BasicNameValuePair("out_trade_no",getTrade()));  //商户订单号  
  21.   
  22.             packageParams.add(new BasicNameValuePair("spbill_create_ip",getLocalHostIp())); //终端IP  
  23.   
  24.             //double price = Double.parseDouble(payment_num.getText().toString()) * (Integer.parseInt(singlePrice) * 100);  
  25.             double price = Double.parseDouble(singlePrice) * 100 * n;  
  26.             int priceInt = (int) price;  
  27.             packageParams.add(new BasicNameValuePair("total_fee", priceInt+""));    //微信接收int型价格  
  28.   
  29.             packageParams.add(new BasicNameValuePair("trade_type""APP"));  //支付类型  
  30.   
  31.             String sign = genAppSign(packageParams);  
  32.             packageParams.add(new BasicNameValuePair("sign", sign));  //签名  
  33.   
  34.             String xmlstring = parseNodeToXML(packageParams);   //转化成xml  
  35.   
  36.             return xmlstring;  
  37.          catch (Exception e)   
  38.             e.printStackTrace();  
  39.             return null;  
  40.           
  41.       

构造这个xml请求参数采用的是httpclient生成的,所以引入了某些包。也可以采用其他方式生成支付订单,只要最后的形式与官网中的形式相同即可。

里面涉及到某些参数的生成,这里列出的是我们项目里面的业务逻辑,当然不同项目可定是不同的。

[java]  view plain  copy  
  1. //获取订单号  
  2.     private String getTrade()  
  3.         long nowTime = System.currentTimeMillis();  
  4.         SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmmss");  
  5.         return format.format(new Date(nowTime));  
  6.       
  7.   
  8.   
  9.   
  10.     //获取支付签名Sign  
  11.     StringBuilder sb = new StringBuilder();  
  12.     private String genAppSign(List<NameValuePair> params)   
  13.         StringBuilder sb = new StringBuilder();  
  14.         for (int i = 0; i < params.size(); i++)   
  15.             sb.append(params.get(i).getName());  
  16.             sb.append('=');  
  17.             sb.append(params.get(i).getValue());  
  18.             sb.append('&');  
  19.           
  20.         sb.append("key=");  
  21.         sb.append(Constants.API_KEY);  
  22.         this.sb.append("sign str\\n" + sb.toString() + "\\n\\n");  
  23.         String appSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();  
  24.         return appSign;  
  25.       
  26.   
  27.     //获取随机字符串  
  28.     private String genNonceStr()   
  29.         Random random = new Random();  
  30.         return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());  
  31.       
  32.   
  33.     /** 
  34.      * 解析为xml格式 
  35.      * @param treeNodes 
  36.      * @return 
  37.      */  
  38.     public String parseNodeToXML(List<NameValuePair> treeNodes)   
  39.         StringBuffer xmlnodes = new StringBuffer();  
  40.         if (treeNodes != null && treeNodes.size() > 0)   
  41.             xmlnodes.append("<xml>");  
  42.             for (int i = 0; i < treeNodes.size(); i++)   
  43.                 NameValuePair node = treeNodes.get(i);  
  44.                 xmlnodes.append("<"+node.getName()+">").append(node.getValue()).append("</"+node.getName()+">");  
  45.               
  46.             xmlnodes.append("</xml>");  
  47.           
  48.         //return xmlnodes.toString();  
  49.         String xml = xmlnodes.toString();  
  50.         tryiOS开发微信支付

    python开发微信支付学习记录(转)

    使用EasyWechat快速开发微信支付

    《C#开发微信门户及应用》

    如何使用easywechat开发微信支付功能

    php开发微信APP支付接口