package com.wx.component;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import org.apache.http.HttpResponse;
import org.apache.struts2.ServletActionContext;
import com.google.gson.Gson;
import com.wx.utils.GetWxOrderno;
import com.wx.utils.RequestHandler;
import com.wx.utils.Sha1Util;
import com.wx.utils.TenpayUtil;
/**
* 欢迎大家关注双面人的网络世界博客 http://blog.csdn.net/qq_30997391
* 大家微信支付时会遇到各种坑,但是我这个demo基本把所有的坑都遇到了,然后写出来的,应该没太大问题,
* 微信要在微信的浏览器才能测试,所以每次都要发布到自己的服务器然后用微信去测试。
* 测试过程中可以看看这个页面的log,会发现到底是哪里出了问题。然后更改对应的内容就好了。
* 只要把参数配置正确了,参照微信的官方文档,微信支付就不会有问题了。
*
* @author aaron
*
*/
public class TopayAction extends HttpServlet {
private String timeStamp;
private String nonceStr;
private String packageStr;
private String paySign;
/**
* 获取JSAPI签名
*
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
*/
public String WxJsApiCheck() {
String jsapi_ticket = getJsapiTicket();// 看清楚.这是ticket..用token在https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi里换的
String nonce_str = Sha1Util.getNonceStr();// 随机字符串
String timestamp = Sha1Util.getTimeStamp();// 时间戳
String appid = "wxb9*************";// APPID,谁在问我为什么报没有APPID就去死吧
String url = "www.{example}.com/{project_name}/pay.jsp";// 发起支付的前端页面的URL地址.而且...而且必须在微信支付里面配置才行!!!
String sign = null;
try {
SortedMap<String, String> packageParams = new TreeMap<String, String>();
packageParams.put("jsapi_ticket", jsapi_ticket);
packageParams.put("noncestr", nonce_str);
packageParams.put("timestamp", timestamp);
packageParams.put("url", url);
sign = Sha1Util.createSHA1Sign(packageParams);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String res = "appId : \"" + appid + "\",timestamp : \"" + timestamp
+ "\", nonceStr : \"" + nonce_str + "\", signature : \"" + sign
+ "\"";
return res;
}
private String getJsapiTicket() {
try {
// 直接访问url来获取返回数据
// 这里必须是https,该死的微信非得用https,否则获取不到数据的
String returnData = getReturnData("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxb9**********&secret=*******************");
Gson gson = new Gson();
TokenClass tokenClass = gson.fromJson(returnData, TokenClass.class);
String token = tokenClass.getAccess_token();
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="
+ token + "&type=jsapi";
String returnData2 = getReturnData(url);
Ticket ticket = gson.fromJson(returnData2, Ticket.class);
if (ticket.getErrcode() == 0) {
return ticket.getTicket();
}
} catch (Exception e) {
e.printStackTrace();
}
return "kgt8ON7yVITDhtdwci0qeTPi4uLRAN-5WPf5pygQ7_8OEmKM518hH7rc9QLKKqTeV2LY4kIoGCVbaXKf3oIwgw";
}
/**
* 内部类,用于Gson解析返回的数据,获取内容
*
* @author aaron
*
*/
private class TokenClass {
private String access_token;
private String expires_in;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getExpires_in() {
return expires_in;
}
public void setExpires_in(String expires_in) {
this.expires_in = expires_in;
}
}
/**
* 内部类,用于Gson解析返回的数据,获取内容
*
* @author aaron
*
*/
private class Ticket {
private Integer errcode;
private String errmsg;
private String ticket;
private String expires_in;
public String getExpires_in() {
return expires_in;
}
public void setExpires_in(String expires_in) {
this.expires_in = expires_in;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
public String getTicket() {
return ticket;
}
public void setTicket(String ticket) {
this.ticket = ticket;
}
public Integer getErrcode() {
return errcode;
}
public void setErrcode(Integer errcode) {
this.errcode = errcode;
}
}
// 支付页面获取openId后获取的值
private String code;
private String state;
private String totalFee;
private String payCodeSuccess;
public String dopay() throws Exception {
String[] split = state.split("CUT");
String payCode = split[1];
// 网页授权后获取传递的参数
String orderNo = payCode;
// 金额转化为分为单位,所以传的时候是分的单位,换成元为单位就加两个零
// 因为我的业务都是整数金额,所以直接拼接两个零,如果涉及到小数,就要进行转换和乘法
String money = split[0] + "00";
// 商户相关资料
String appid = "wxb**************";
String appsecret = "15beb7f******************";
String mch_id = "1373*****";// 邮件里的商户号
String partnerkey = "sdjsdhfksjd**********************";// 在微信商户平台pay.weixin.com里自己写入的那个key
String openId = getOpenId();
// 用oath授权得到的openid
// 获取openId后调用统一支付接口https://api.mch.weixin.qq.com/pay/unifiedorder
String currTime = TenpayUtil.getCurrTime();
// 8位日期
String strTime = currTime.substring(8, currTime.length());
// 四位随机数
String strRandom = TenpayUtil.buildRandom(4) + "";
// 10位序列号,可以自行调整。
String strReq = strTime + strRandom;
// 子商户号 非必输
// String sub_mch_id="";
// 设备号 非必输
String device_info = "";
// 随机数
String nonce_str = strReq;
// 商品描述
// String body = describe;
// 商品描述根据情况修改
String body = "微信支付Demo";
// 附加数据
// String attach = userId;
// 商户订单号
String out_trade_no = orderNo;
// int intMoney = Integer.parseInt(finalmoney);
// 总金额以分为单位,不带小数点
// int total_fee = intMoney;
// 订单生成的机器 IP
HttpServletRequest request = ServletActionContext.getRequest();
String ipAddress = request.getRemoteAddr();
if (ipAddress.equals("0:0:0:0:0:0:0:1%0")) {
ipAddress = "172.168.0.1";
}
String spbill_create_ip = ipAddress;
// 订 单 生 成 时 间 非必输
// String time_start ="";
// 订单失效时间 非必输
// String time_expire = "";
// 商品标记 非必输
// String goods_tag = "";
// 这里notify_url是 支付完成后微信发给该链接信息,可以判断会员是否支付成功,改变订单状态等。
String notify_url = "http://www.{example}.com/{project_name}/WXPayBack.action";
String trade_type = "JSAPI";
String openid = openId;
// 非必输
// String product_id = "";
SortedMap<String, String> packageParams = new TreeMap<String, String>();
packageParams.put("appid", appid);
packageParams.put("mch_id", mch_id);
packageParams.put("nonce_str", nonce_str);
packageParams.put("body", body);
// package
没有合适的资源?快使用搜索试试~ 我知道了~
Java微信网页端,公众号支付Demo

共79个文件
class:18个
java:15个
jar:10个


温馨提示
微信支付处处是坑,真的是惨痛的经历,所以赶紧分享给大家,让大家顺利过坑,有问题欢迎留言。谢谢(缺少部分包,请根据其他人评论酌情下载)
资源推荐
资源详情
资源评论









收起资源包目录











































































































共 79 条
- 1

JohnathonZ
- 粉丝: 22
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 模块六数据库基础.ppt
- Admin.NET-C#资源
- 计算机辅助制造CADCAM关系-.ppt
- 计算机通识教育课程智慧课堂教学实践研究.docx
- 中小型网络设计与实现.doc
- JFinal-PHP资源
- 智能空调-智能家居生活发展分析.docx
- 非标自动化设备项目进度表.xls
- CAD工程制图键盘快捷命令2.doc
- 消费需求下互联网金融模式研究.docx
- 校园植物信息化在《植物学》教学中的应用.docx
- ChatArea-JavaScript资源
- 集团云计算咨询项目详细设计方案.pdf
- 针对大数据时代企业人力资源管理变革的思考.docx
- 大数据视角下的司法改革评估机制构建.docx
- TCP协议网络通信设计方案与实现.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

- 1
- 2
- 3
- 4
- 5
前往页