java微信支付代码_Java微信支付之服务号支付代码示例

Java微信支付之服务号支付实现,网上的java微信支付sdk和Demo基本上是水的,看着头疼所以我决心自己开始写Java微信支付之公众号支付,多的不说见下面源码,为了方便使用我分别用了两个Servlet,一个是统一下单UnifiedorderServlet,一个是支付回调PayCallBackServlet,你们可以自己封装。

一是统一下单UnifiedorderServlet:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.io.UnsupportedEncodingException;

import java.net.HttpURLConnection;

import java.net.URL;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.Random;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.http.ParseException;

import org.apache.http.client.ClientProtocolException;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONML;

import org.json.JSONObject;

public class UnifiedorderServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

private static final String appid = "";// 找微信

private static final String mch_id = "";// 找微信

public static final String api_key = "";// 找微信

private static final String trade_type = "JSAPI";// 写死

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html; charset=utf-8");

PrintWriter out = response.getWriter();

JSONObject jso = new JSONObject();

double money = 0.01;

String openId = "", out_trade_no = "", body = "测试", ip = "";

try {

out.print(execute(out_trade_no, body, openId, money, ip, jso).toString());

} catch (JSONException e) {

e.printStackTrace();

}

out.flush();

out.close();

}

/**

* 微信服务号统一下单支付

*

* @param out_trade_no

* 订单号

* @param body

* 标题

* @param openId

* 用户的openId

* @param money

* 支付金额

* @param ip

* 客户端ip

* @param request

* HttpServletRequest

* @return

* @throws JSONException

*/

public JSONObject execute(String out_trade_no, String body, String openId, double money, String ip, JSONObject jso) throws JSONException {

StringBuilder xml = new StringBuilder();

String notify_url = "https://test.com/payCallBack";// 支付回调地址

String prepay_id = "", sign = "", charset = "UTF-8", nonce_str = "";

try {

String weixinMoney = new java.text.DecimalFormat("#").format(money * 100);// 微信是以分为单位的所以要乘以100

nonce_str = getRandomString(32);

xml.append("appid=").append(appid).append("&body=").append(new String(body.getBytes(charset), charset));// 处理中文

xml.append("&mch_id=").append(mch_id).append("&nonce_str=").append(nonce_str);

xml.append("¬ify_url=").append(notify_url).append("&openid=").append(openId);

xml.append("&out_trade_no=").append(out_trade_no).append("&spbill_create_ip=").append(ip);

xml.append("&total_fee=").append(weixinMoney).append("&trade_type=").append(trade_type).append("&key=").append(api_key);

sign = MD5Purity(xml.toString());

// System.out.println(xml);

xml.delete(0, xml.length());

xml.append("");

xml.append(" ").append(appid).append("");

xml.append("").append(body).append("");

xml.append(" ").append(mch_id).append("");

xml.append(" ").append(nonce_str).append("");

xml.append(" ").append(openId).append("");

xml.append(" ").append(notify_url).append("");

xml.append(" ").append(out_trade_no).append("");

xml.append(" ").append(ip).append("");

xml.append(" ").append(weixinMoney).append("");

xml.append(" ").append(trade_type).append("");

xml.append(" ").append(sign).append("");

xml.append("");

HttpURLConnection conn = (HttpURLConnection) new URL("https://api.mch.weixin.qq.com/pay/unifiedorder").openConnection();

conn.setDoOutput(true);

conn.setRequestMethod("POST");

conn.setRequestProperty("Content-Type", "text/xml");

conn.setRequestProperty("Charset", charset);

OutputStream os = conn.getOutputStream();

os.write(xml.toString().getBytes(charset));

xml.delete(0, xml.length());

os.close();

int responseCode = conn.getResponseCode();

InputStreamReader in = null;

BufferedReader br = null;

if (responseCode == 200) {

in = new InputStreamReader(conn.getInputStream(), charset);

br = new BufferedReader(in);

String retData = null;

while ((retData = br.readLine()) != null)

xml.append(retData);

JSONArray childNodes = JSONML.toJSONObject(xml.toString()).getJSONArray("childNodes");

int len = childNodes.length() - 1;

for (int i = len; i > -1; i--) {

JSONObject js = childNodes.getJSONObject(i);

if (js.get("tagName").equals("prepay_id")) {

prepay_id = js.getJSONArray("childNodes").getString(0);

break;

}

}

}

if (in != null)

in.close();

if (br != null)

br.close();

conn.disconnect();

// ----------------------------------给h5返回的数据

String timeStamp = System.currentTimeMillis() + "";

timeStamp = timeStamp.substring(0, 10);// 微信只要精确到秒

nonce_str = getRandomString(32);

jso.put("appId", appid);

jso.put("nonceStr", nonce_str);

jso.put("package", "prepay_id=" + prepay_id);

jso.put("signType", "MD5");

jso.put("timeStamp", timeStamp);

xml.delete(0, xml.length());

xml.append("appId=").append(appid);

xml.append("&nonceStr=").append(nonce_str);

xml.append("&package=").append(jso.getString("package"));

xml.append("&signType=").append(jso.getString("signType"));

xml.append("&timeStamp=").append(timeStamp);

xml.append("&key=").append(api_key);

sign = MD5Purity(new String(xml.toString().getBytes(charset), charset));

jso.put("paySign", sign);

//返回的数据主要用在这地方 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

// ----------------------------------给h5返回的数据

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (ParseException e) {

e.printStackTrace();

} catch (ClientProtocolException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return jso;

}

/**

* MD5

*

* @param plainText

* @return

*/

public String MD5Purity(String plainText) {

try {

MessageDigest md = MessageDigest.getInstance("MD5");

md.update(plainText.getBytes("utf-8"));

byte b[] = md.digest();

int i;

StringBuffer buf = new StringBuffer("");

for (int offset = 0; offset < b.length; offset++) {

i = b[offset];

if (i < 0)

i += 256;

if (i < 16)

buf.append("0");

buf.append(Integer.toHexString(i));

}

plainText = buf.toString();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return plainText.toUpperCase();

}

/**

* 生成一个随机字符串

*

* @param length

* 表示生成字符串的长度

* @return

*/

private String getRandomString(int length) {

String base = "abcdefghijklmnopqrstuvwxyz0123456789";

Random random = new Random();

StringBuffer sb = new StringBuffer();

for (int i = 0; i < length; i++) {

int number = random.nextInt(base.length());

sb.append(base.charAt(number));

}

return sb.toString();

}

}

二是支付回调PayCallBackServlet:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.PrintWriter;

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONML;

import org.json.JSONObject;

public class PayCallBackServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html; charset=utf-8");

PrintWriter out = response.getWriter();

out.print(doWxServer(request));

out.flush();

out.close();

}

/**

* 处理微信回调

*

* @param request

* @return

* @throws ServletException

* @throws IOException

*/

public String doWxServer(HttpServletRequest request) {

System.out.println("微信服务号支付回调");

String inputLine;

StringBuilder notityXml = new StringBuilder();

BufferedReader bufferedReader = null;

try {

bufferedReader = request.getReader();

while ((inputLine = bufferedReader.readLine()) != null)

notityXml.append(inputLine);

if (bufferedReader != null)

bufferedReader.close();

if (notityXml.length() < 10) {

return "fail";

}

String appid = "", total_fee = "", bank_type = "", cash_fee = "", fee_type = "", is_subscribe = "", mch_id = "", nonce_str = "";

String out_trade_no = "", transaction_id = "", openid = "", sign = "", result_code = "", return_code = "", time_end = "", trade_type = "";

JSONArray result = JSONML.toJSONObject(notityXml.toString()).getJSONArray("childNodes");

int len = result.length();

for (int i = 0; i < len; i++) {

JSONObject js = result.getJSONObject(i);

Object tagName = js.get("tagName");

if (tagName.equals("appid")) {

appid = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("bank_type")) {

bank_type = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("cash_fee")) {

cash_fee = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("fee_type")) {

fee_type = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("is_subscribe")) {

is_subscribe = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("mch_id")) {

mch_id = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("nonce_str")) {

nonce_str = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("openid")) {

openid = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("out_trade_no")) {

out_trade_no = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("result_code")) {

result_code = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("return_code")) {

return_code = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("time_end")) {

time_end = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("total_fee")) {

total_fee = js.getJSONArray("childNodes").getInt(0) + "";

} else if (tagName.equals("trade_type")) {

trade_type = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("transaction_id")) {

transaction_id = js.getJSONArray("childNodes").getString(0);

} else if (tagName.equals("sign")) {

sign = js.getJSONArray("childNodes").getString(0);

}

}

StringBuilder str = new StringBuilder();

str.append("appid=").append(appid).append("&bank_type=").append(bank_type).append("&cash_fee=").append(cash_fee).append("&fee_type=");

str.append(fee_type).append("&is_subscribe=").append(is_subscribe).append("&mch_id=").append(mch_id).append("&nonce_str=");

str.append(nonce_str).append("&openid=").append(openid).append("&out_trade_no=").append(out_trade_no).append("&result_code=").append(result_code)

.append("&return_code=").append(return_code).append("&time_end=").append(time_end).append("&total_fee=").append(total_fee);

str.append("&trade_type=").append(trade_type).append("&transaction_id=").append(transaction_id).append("&key=").append(UnifiedorderServlet.api_key);

if (!MD5Purity(str.toString()).equals(sign)) {// 验证签名

System.out.println("微信服务号支付回调签名异常sign=" + sign);

System.out.println(str);

System.out.println(result);

return "fail";

}

total_fee = new java.text.DecimalFormat("#0.00").format(Double.parseDouble(total_fee) / 100);// 支付金额以分为单位

return "";//成功后给微信返回数据

} catch (JSONException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return "fail";

}

/**

* MD5

*

* @param plainText

* @return

*/

public String MD5Purity(String plainText) {

try {

MessageDigest md = MessageDigest.getInstance("MD5");

md.update(plainText.getBytes("utf-8"));

byte b[] = md.digest();

int i;

StringBuffer buf = new StringBuffer("");

for (int offset = 0; offset < b.length; offset++) {

i = b[offset];

if (i < 0)

i += 256;

if (i < 16)

buf.append("0");

buf.append(Integer.toHexString(i));

}

plainText = buf.toString();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return plainText.toUpperCase();

}

}

大功告成

总结

以上就是本文关于Java微信支付之服务号支付代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:快速理解Java设计模式中的组合模式、Java编程接口调用的作用及代码分享、浅谈java中字符串数组、字符串、整形之间的转换等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

朴素贝叶斯分类器python_朴素贝叶斯分类器及Python实现

贝叶斯定理贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理&#xff0c;在概率论中具有重要地位。先验概率分布(边缘概率)是指基于主观判断而非样本分布的概率分布&#xff0c;后验概率(条件概率)是根据样本分布和未知参数的先验概率分布求得的条件概率…

RDD模型

Spark是Berkeley大学AMP&#xff08;stands for Algorithms, Machines, and People&#xff09;实验室开发的一个项目。它是一个基于RDD&#xff08;Resilient Distributed Datasets&#xff09;模型&#xff0c;能够支持计算MapReduce模式的作业&#xff0c;主要用于迭代计算和…

计算机视觉python入门_计算机视觉应该怎样入门?

自学了一段时间计算机视觉(Computer Vision)&#xff0c;下文简称&#xff1a;CV。内容以基本概念为主&#xff0c;形式以看书为主&#xff0c;跟着敲代码为辅。起因&#xff1a;因工作中会涉及到交通物流风险管理、出险理赔材料审查等内容&#xff0c;会涉及到大量人工介入审阅…

java lambda if_使用Java8的Lambda实现Monda -解道Jdon

使用Java8的Lambda实现MonadMonad是函数语言(Cojure或Scala)中的设计模式概念&#xff0c; 那么现在为什么在Java中变得如此重要&#xff1f;因为Java从版本8以后引入了新的Lambda特性&#xff0c;Lambda或闭包是函数语言的特征&#xff0c;它允许你使用代码块作为一个变量&…

ConcurrentHashMap,一个更快的HashMap

ConcurrentHashMap 是 Doug Lea 的 util.concurrent 包的一部分&#xff0c;它提供比 Hashtable 或者 synchronizedMap 更高程度的并发性。而且&#xff0c;对于大多数成功的 get() 操作它会设法避免完全锁定&#xff0c;其结果就是使得并发应用程序有着非常好的吞吐量。这个月…

python算法与程序设计基础(第二版)第八章实训答案_Python算法与程序设计基础(第2版)...

章程序设计与计算思维1.1程序设计与计算机语言1.1.1程序设计1.1.2设计步骤1.1.3程序设计分类1.1.4基本规范1.1.5计算机语言1.2计算机语言与计算思维的关系1.2.1思维与计算思维1.2.2计算思维与计算科学的关系1.2.3计算思维与程序设计语言的关系1.3初识Python语言1.3.1Python语言…

python处理图片隐写分析_Python3简单实现隐写术

下载W3Cschool手机App&#xff0c;0基础随时随地学编程>>戳此了解导语利用Python简单实现图片隐写术。。。或者说是水印技术。。。说实话&#xff0c;真的只是简单实现。。。没什么技术含量。。。可以说是入门级的隐写术/水印技术。。。Lets Go?相关文件密码: 9ffy开发工…

使用Jquery提交Json格式的数据到Asp.net程序的另类做法

一般我们使用Jquery提交数据到Asp.net程序都有两种方法,今天我再介绍一种方法.以下是详细描述: 1)使用Get请求的方式,将参数接在请求Url的后面.例如: http://www.google.com.hk/search?qjquerypost 获取参数的方法:在Asp.net中可以使用Request.QueryString["q"]来获…

python xml添加命名空间_XML的命名空间与python解析方法

在 XML 中&#xff0c;元素名称是由开发者定义的&#xff0c;当两个不同的文档使用相同的元素名时&#xff0c;就会发生命名冲突&#xff0c;而XML 命名空间提供避免元素命名冲突的方法。XML 命名空间属性被放置于元素的开始标签之中&#xff0c;并使用以下的语法&#xff1a;x…

详解在Visual Studio中使用git版本系统(转)

http://www.uml.org.cn/pzgl/201206211.asp 转载于:https://www.cnblogs.com/kevin3274/archive/2012/08/29/2662556.html

java派生类_我可以使派生类从Java的基类继承派生成员...

我有看起来像这样的代码&#xff1a;public class A{public void doStuff(){System.out.print("Stuff successfully done");}}public class B extends A{public void doStuff(){System.out.print("Stuff successfully done, but in a different way");}pub…

流程图中的虚线含义_还在为画流程图烦恼,焦躁?介绍一款画图神器,让你爱上画图!...

在团队协作过程中最常见的就是开会、开会最常用的就是图&#xff0c;而图中最常见的就是流程图&#xff0c;时序图&#xff0c;类图等下面介绍一款画图神器&#xff1a;PlantUMLPlantUML是一个开源项目&#xff0c;支持快速绘制&#xff1a;时序图用例图类图活动图组件图状态图…

有限状态自动机java实现_用java开发编译器之:Thompson构造,将正则表达式转换为有限状态自动机...

阅读博客的朋友可以到我的网易云课堂中&#xff0c;通过视频的方式查看代码的调试和执行过程&#xff1a;上一节&#xff0c;我们通过代码&#xff0c;实现了一个有限状态自动机&#xff0c;并将其应用于对整形和浮点数的识别。构造有限状态自动机&#xff0c;并驱动它&#xf…

Zend Server搭建网站备注

1、Zend Server的使用 Zend Server自带php和apache,所以装zendserver的话不需要再安装其他任何东西。&#xff08;mysql默认没有安装&#xff0c;可以自行设置&#xff09; 2、工作路径配置&#xff1a; 在Zend\Apache2\conf\httpd.conf中添加 Alias/test "F:/workbench/t…