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
- //获取产品订单信息
- private String genProductArgs()
- StringBuffer xml = new StringBuffer();
- try
- String nonceStr = genNonceStr();
- xml.append("</xml>");
- List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
- packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID)); //APPID
- packageParams.add(new BasicNameValuePair("body", "单价:" + singlePrice + " x " + payment_num.getText().toString() + "份")); //简单描述
- packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID)); //商户ID
- packageParams.add(new BasicNameValuePair("nonce_str", nonceStr)); //随机字符串
- packageParams.add(new BasicNameValuePair("notify_url","http://www.weixin.qq.com/wxpay/pay.php")); //通知地址
- packageParams.add(new BasicNameValuePair("out_trade_no",getTrade())); //商户订单号
- packageParams.add(new BasicNameValuePair("spbill_create_ip",getLocalHostIp())); //终端IP
- //double price = Double.parseDouble(payment_num.getText().toString()) * (Integer.parseInt(singlePrice) * 100);
- double price = Double.parseDouble(singlePrice) * 100 * n;
- int priceInt = (int) price;
- packageParams.add(new BasicNameValuePair("total_fee", priceInt+"")); //微信接收int型价格
- packageParams.add(new BasicNameValuePair("trade_type", "APP")); //支付类型
- String sign = genAppSign(packageParams);
- packageParams.add(new BasicNameValuePair("sign", sign)); //签名
- String xmlstring = parseNodeToXML(packageParams); //转化成xml
- return xmlstring;
- catch (Exception e)
- e.printStackTrace();
- return null;
构造这个xml请求参数采用的是httpclient生成的,所以引入了某些包。也可以采用其他方式生成支付订单,只要最后的形式与官网中的形式相同即可。
里面涉及到某些参数的生成,这里列出的是我们项目里面的业务逻辑,当然不同项目可定是不同的。
[java] view plain copy
- //获取订单号
- private String getTrade()
- long nowTime = System.currentTimeMillis();
- SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmmss");
- return format.format(new Date(nowTime));
- //获取支付签名Sign
- StringBuilder sb = new StringBuilder();
- private String genAppSign(List<NameValuePair> params)
- 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(Constants.API_KEY);
- this.sb.append("sign str\\n" + sb.toString() + "\\n\\n");
- String appSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
- return appSign;
- //获取随机字符串
- private String genNonceStr()
- Random random = new Random();
- return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
- /**
- * 解析为xml格式
- * @param treeNodes
- * @return
- */
- public String parseNodeToXML(List<NameValuePair> treeNodes)
- StringBuffer xmlnodes = new StringBuffer();
- if (treeNodes != null && treeNodes.size() > 0)
- xmlnodes.append("<xml>");
- for (int i = 0; i < treeNodes.size(); i++)
- NameValuePair node = treeNodes.get(i);
- xmlnodes.append("<"+node.getName()+">").append(node.getValue()).append("</"+node.getName()+">");
- xmlnodes.append("</xml>");
- //return xmlnodes.toString();
- String xml = xmlnodes.toString();
- tryiOS开发微信支付