java开发微信APP支付
直接上代码
String nonce_str=WXPayUtil.generateNonceStr(); //WXPayUtil微信自己有的,自己下载,这里是生成随机字符串,下载地址(下载java的里面就有):https://pay.weixin.qq.com/wiki/doc/api/native_sl.php?chapter=11_1
SortedMap<String, String> signParams = new TreeMap<String, String>();
signParams.put("appid", weChatConfig.getAppWxAppId());//app_id---需要申请
signParams.put("body",weChatConfig.getBody());//商品参数信息
signParams.put("mch_id", weChatConfig.getWxMchId());//微信商户账号--需要申请
signParams.put("nonce_str", nonce_str);//32位不重复的编号
signParams.put("notify_url", weChatConfig.getNotifyUrl());//回调页面--这个是回调接口
signParams.put("out_trade_no", orderUserId);//订单编号
BigDecimal transValue = new BigDecimal("100");
// 计算微信的总金额乘以100
BigDecimal bTotalPrice = totalPrice.multiply(transValue);
int totalFee = bTotalPrice.intValue();
signParams.put("total_fee",String.valueOf(totalFee));//支付金额 单位为分
signParams.put("trade_type", "APP"); //app支付
String sign = createSign("UTF-8", signParams);//生成签名
signParams.put("sign", sign);
signParams.remove("key");//调用统一下单无需key(商户应用密钥)
String requestXml = getRequestXml(signParams);//生成Xml格式的字符串
String result = CommonUtil.httpsRequest(weChatConfig.getWxPayUnifiedorderUrl(), "POST", requestXml);
//返回的result成功结果取出prepay_id:
Map map = null;
try {
map = doXMLParse(result);
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String return_code=(String) map.get("return_code");
String prepay_id =null;
if (return_code.contains("SUCCESS")){
prepay_id=(String) map.get("prepay_id");//获取到prepay_id
}
long currentTimeMillis = System.currentTimeMillis();//生成时间戳
long second = currentTimeMillis / 1000L;//(转换成秒)
String seconds = String.valueOf(second).substring(0, 10);//(截取前10位)
SortedMap<String, String> signParam = new TreeMap<String, String>();
signParam.put("appid", weChatConfig.getAppWxAppId());//app_id
signParam.put("partnerid", weChatConfig.getWxMchId());//微信商户账号
signParam.put("prepayid", prepay_id);//预付订单id
signParam.put("package", "Sign=WXPay");//默认sign=WXPay
signParam.put("noncestr", nonce_str);//自定义不重复的长度不长于32位
signParam.put("timestamp",seconds);//北京时间时间戳
String signAgain = createSign("UTF-8", signParam);//再次生成签名
signParam.put("sign", signAgain);
return ApiResult.result(signParam);
其他
//定义签名,微信根据参数字段的ASCII码值进行排序 加密签名,故使用SortMap进行参数排序
public String createSign(String characterEncoding, SortedMap<String,String> parameters){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();
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=" + weChatConfig.getWxApiKey());//最后加密时添加商户密钥,由于key值放在最后,所以不用添加到SortMap里面去,单独处理,编码方式采用UTF-8
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
//将封装好的参数转换成Xml格式类型的字符串
public String getRequestXml(SortedMap<String,String> parameters){
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
Set es = parameters.entrySet();
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
String v = (String)entry.getValue();
if("sign".equalsIgnoreCase(k)){
}
else if ("attach".equalsIgnoreCase(k)||"body".equalsIgnoreCase(k)) {
sb.append("<"+k+">"+"<![CDATA["+v+"]]></"+k+">");
}
else {
sb.append("<"+k+">"+v+"</"+k+">");
}
}
sb.append("<"+"sign"+">"+"<![CDATA["+parameters.get("sign")+"]]></"+"sign"+">");
sb.append("</xml>");
return sb.toString();
}
/**
* 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
* @param strxml
* @return
* @throws JDOMException
* @throws IOException
*/
public Map doXMLParse(String strxml) throws JDOMException, IOException {
strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");
if(null == strxml || "".equals(strxml)) {
return null;
}
Map m = new HashMap();
InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(in);
Element root = doc.getRootElement();
List list = root.getChildren();
Iterator it = list.iterator();
while(it.hasNext()) {
Element e = (Element) it.next();
String k = e.getName();
String v = "";
List children = e.getChildren();
if(children.isEmpty()) {
v = e.getTextNormalize();
} else {
v = getChildrenText(children);
}
m.put(k, v);
}
//关闭流
in.close();
return m;
}
/**
* 获取子结点的xml
* @param children
* @return String
*/
public String getChildrenText(List children) {
StringBuffer sb = new StringBuffer();
if(!children.isEmpty()) {
Iterator it = children.iterator();
while(it.hasNext()) {
Element e = (Element) it.next();
String name = e.getName();
String value = e.getTextNormalize();
List list = e.getChildren();
sb.append("<" + name + ">");
if(!list.isEmpty()) {
sb.append(getChildrenText(list));
}
sb.append(value);
sb.append("</" + name + ">");
}
}
return sb.toString();
}
public class MD5Util {
    private static String byteArrayToHexString(byte b[]) {
        StringBuffer resultSb = new StringBuffer();
        for (int i = 0; i < b.length; i++)
            resultSb.append(byteToHexString(b[i]));
        return resultSb.toString();
    }
    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0)
            n += 256;
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
    }
    public static String MD5Encode(String origin, String charsetname) {
        String resultString = null;
        try {
            resultString = new String(origin);
            MessageDigest md = MessageDigest.getInstance("MD5");
            if (charsetname == null || "".equals(charsetname))
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes()));
            else
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes(charsetname)));
        } catch (Exception exception) {
        }
        return resultString;
    }
    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
}
public class CommonUtil {
   public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {
      try {
         URL url = new URL(requestUrl);
         HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
         conn.setDoOutput(true);
         conn.setDoInput(true);
         conn.setUseCaches(false);
         // 设置请求方式(GET/POST)
         conn.setRequestMethod(requestMethod);
         conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
         // 当outputStr不为null时向输出流写数据
         if (null != outputStr) {
            OutputStream outputStream = conn.getOutputStream();
            // 注意编码格式
            outputStream.write(outputStr.getBytes("UTF-8"));
            outputStream.close();
         }
         // 从输入流读取返回内容
         InputStream inputStream = conn.getInputStream();
         InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
         BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
         String str = null;
         StringBuffer buffer = new StringBuffer();
         while ((str = bufferedReader.readLine()) != null) {
            buffer.append(str);
         }
         // 释放资源
         bufferedReader.close();
         inputStreamReader.close();
         inputStream.close();
         inputStream = null;
         conn.disconnect();
         return buffer.toString();
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }
   public String httpRequest(String urlStr, String xml) throws UnsupportedEncodingException {
      StringBuilder sb = new StringBuilder();
      try {
         URL url = new URL(urlStr);
         URLConnection con = url.openConnection();
         con.setDoOutput(true);
         con.setRequestProperty("Pragma", "no-cache");// 【Pragma:】centos7报错,不合法
         con.setRequestProperty("Cache-Control", "no-cache");
         con.setRequestProperty("Content-Type", "text/xml");
         OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream());
         out.write(new String(xml.getBytes("UTF-8")));
         out.flush();
         out.close();
         BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
         String line = "";
         for (line = br.readLine(); line != null; line = br.readLine()) {
            sb.append(line);
         }
      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
      return new String(sb.toString().getBytes(), "UTF-8");
   }
}
java开发微信APP支付的更多相关文章
- php开发微信APP支付接口
		之前在开发APP中用到了微信支付,因为是第一次用,所以中途也遇到了好多问题,通过查看文档和搜集资料,终于完成了该功能的实现.在这里简单分享一下后台php接口的开发实例. 原文地址:代码汇个人博客 ht ... 
- 微信APP支付(基于Java实现微信APP支付)
		步骤: 导入maven依赖 <!--微信支付--> <dependency> <groupId>com.github.wxpay</groupId> & ... 
- 开发微信App支付
		1.首先到官方下载Demo,地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 下载后的目录结构如下: 
- Android版-微信APP支付
		首发地址: Android版-微信APP支付 欢迎留言.转发 微信极速开发系列文章(微信支付.授权获取用户信息等):点击这里 目录 1.注册账号.开发者认证 2.添加应用 3.申请微信支付 4.技术开 ... 
- .net 微信APP支付接口的开发流程以及坑
		流程 申请APP的微信支付 申请成功之后得到APPID 商户号 以及自己设置商户号的支付密码 这时就可以开发接口了 微信APP支付API:https://pay.weixin.qq.com/wiki/ ... 
- java实现微信H5支付
		前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹的文档敲敲敲,所以记录下来,以供自 ... 
- 微信app支付android客户端以及.net服务端实现
		由于公司运营需要,需要在客户端(android/ios)增加微信以及支付宝支付,在调用微信app支付时遇到一些问题,也算是一些踩过的坑,记录下来 ,希望能对.net开发者服务端网站更快的集成微信app ... 
- H5使用codovar插件实现微信支付(微信APP支付模式,前端)
		H5打包的app实现微信支付及支付宝支付,本章主要详解微信支付,支付宝支付请查看另一篇“H5使用codovar插件实现支付宝支付(支付宝APP支付模式,前端)” ps:本文只试用H5开发的,微信 AP ... 
- 微信支付-微信公众号支付,微信H5支付,微信APP支付,微信扫码支付
		在支付前,如果使用第三方MVC框架,则使用重写模式,服务器也需要配置该项 if (!-e $request_filename){ rewrite ^/(.*)$ /index.php/$ last; ... 
- 微信APP支付整体流程记录备忘
		支付整体流程见文档:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3 商户系统和微信支付系统主要交互说明: 步骤1: ... 
随机推荐
- java基础(非常简单)
			java javaSE 注释: block块级 line 行 标识符和关键字 组成部分.变量名.类名.方法名--------标识符 $\数字._\字母 数据类型 强类型语言---安全性高--速度会慢 ... 
- MQ收到无序的消息时如何进行业务处理
			业务背景 跟第三方系统做对接,双方通过ActiveMQ进行通信,消息之间是有内在关联的,也就是消息本来应该是有业务顺序的,但由于一些原因,现在收到消息是乱序的,这种情况下做业务处理就有一点小问题了 方 ... 
- python下载图片实现方法
			转载: https://www.jb51.net/article/119178.htm 
- 基于C++的OpenGL 09 之材质
			1. 引言 本文基于C++语言,描述OpenGL的材质 前置知识可参考: 基于C++的OpenGL 08 之基础光照 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者这里不过多描 ... 
- django我学习的第一个web框架
			第一个APP----------联通后台管理系统 第二个APP----------baby商场 
- 10.MyBatis-Plus的使用
			整合MyBatis-Plus 导入依赖 在解决逆向工程生成的代码报错时候已经给bianen-common导入了依赖 导入数据库的驱动 导入驱动和MySql的版本有关,我安装的MySql版本是5.7.3 ... 
- 1223. 掷骰子模拟 (Hard)
			问题描述 1223. 掷骰子模拟 (Hard) 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时, 连续 掷出数字 i 的次数不能超过 ... 
- Google Earth Engine——基于新的Landsat SR数据集去云处理
			根据GEE官方公告,明年原来的Landsat/LT05/C01/T1_SR和Landsat/LC08/C01/T1_SR数据集将停止更新,并提供了新的地表反射率数据,就是LANDSAT/LT05/C0 ... 
- NSIS KillProcDLL插件 扩展使用
			客户端插件KillProcDLL ,用于结束进程. 官网文档:https://nsis.sourceforge.io/KillProcDLL_plug-in 使用场景 卸载程序时,结束正在运行的应用程 ... 
- Ubuntu更换国内apt-get源
			更换方法: cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i 's/archive.ubuntu.com/mirrors.u ... 
