微信公众号支付java版本
回调函数
@RequestMapping("/toPay")
public String toPay(HttpServletRequest request, HttpServletResponse response, Model model){
System.out.println("toPay success");
try {
String orderId = request.getParameter("orderId");
System.out.println("in toPay,orderId:" + orderId);
String totalFeeStr = request.getParameter("totalFee");
Float totalFee = 0.0f;
if(StringUtils.isNotBlank(totalFeeStr)){
totalFee = new Float(totalFeeStr);
}
//网页授权后获取传递的参数
//String userId = request.getParameter("userId");
String code = request.getParameter("code");
System.out.println("code:"+code);
//System.out.println("userId:"+userId);
//获取统一下单需要的openid
String openId ="";
String URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ WxPayConfig.appid + "&secret=" + WxPayConfig.appsecret + "&code=" + code + "&grant_type=authorization_code";
System.out.println("URL:"+URL);
JSONObject jsonObject = CommonUtil.httpsRequest(URL, "GET", null);
if (null != jsonObject) {
openId = jsonObject.getString("openid");
System.out.println("openId:" + openId);
}
//获取openId后调用统一支付接口https://api.mch.weixin.qq.com/pay/unifiedorder
//随机数
//String nonce_str = "1add1a30ac87aa2db72f57a2375d8fec";
String nonce_str = UUID.randomUUID().toString().replaceAll("-", "");
//商品描述
String body = orderId;
//商户订单号
String out_trade_no = orderId;
//订单生成的机器 IP
String spbill_create_ip = request.getRemoteAddr();
//总金额
//TODO
Integer total_fee = Math.round(totalFee*100);
//Integer total_fee = 1;
//商户号
//String mch_id = partner;
//子商户号 非必输
//String sub_mch_id="";
//设备号 非必输
//String device_info="";
//附加数据
//String attach = userId;
//总金额以分为单位,不带小数点
//int total_fee = intMoney;
//订 单 生 成 时 间 非必输
//String time_start ="";
//订单失效时间 非必输
//String time_expire = "";
//商品标记 非必输
//String goods_tag = "";
//非必输
//String product_id = "";
//这里notify_url是 支付完成后微信发给该链接信息,可以判断会员是否支付成功,改变订单状态等。
String notify_url = baseUrl + "/wx/notifyUrl.do";
SortedMap<String, String> packageParams = new TreeMap<String, String>();
packageParams.put("appid", WxPayConfig.appid);
packageParams.put("mch_id", WxPayConfig.partner);
packageParams.put("nonce_str", nonce_str);
packageParams.put("body", body);
packageParams.put("out_trade_no", out_trade_no);
packageParams.put("total_fee", total_fee+"");
packageParams.put("spbill_create_ip", spbill_create_ip);
packageParams.put("notify_url", notify_url);
packageParams.put("trade_type", WxPayConfig.trade_type);
packageParams.put("openid", openId);
RequestHandler reqHandler = new RequestHandler(request, response);
reqHandler.init(WxPayConfig.appid, WxPayConfig.appsecret, WxPayConfig.partnerkey);
String sign = reqHandler.createSign(packageParams);
System.out.println("sign:"+sign);
String xml="<xml>"+
"<appid>"+WxPayConfig.appid+"</appid>"+
"<mch_id>"+WxPayConfig.partner+"</mch_id>"+
"<nonce_str>"+nonce_str+"</nonce_str>"+
"<sign>"+sign+"</sign>"+
"<body><![CDATA["+body+"]]></body>"+
"<out_trade_no>"+out_trade_no+"</out_trade_no>"+
"<total_fee>"+total_fee+""+"</total_fee>"+
"<spbill_create_ip>"+spbill_create_ip+"</spbill_create_ip>"+
"<notify_url>"+notify_url+"</notify_url>"+
"<trade_type>"+WxPayConfig.trade_type+"</trade_type>"+
"<openid>"+openId+"</openid>"+
"</xml>";
System.out.println("xml:"+xml);
String createOrderURL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
String prepay_id="";
try {
prepay_id = WeixinPayUtil.getPayNo(createOrderURL, xml);
System.out.println("prepay_id:" + prepay_id);
if(prepay_id.equals("")){
request.setAttribute("ErrorMsg", "统一支付接口获取预支付订单出错");
response.sendRedirect("error.jsp");
}
} catch (Exception e1) {
e1.printStackTrace();
}
SortedMap<String, String> finalpackage = new TreeMap<String, String>();
String timestamp = Sha1Util.getTimeStamp();
String packages = "prepay_id="+prepay_id;
finalpackage.put("appId", WxPayConfig.appid);
finalpackage.put("timeStamp", timestamp);
finalpackage.put("nonceStr", nonce_str);
finalpackage.put("package", packages);
finalpackage.put("signType", WxPayConfig.signType);
String finalsign = reqHandler.createSign(finalpackage);
System.out.println("/jsapi?appid="+WxPayConfig.appid+"&timeStamp="+timestamp+"&nonceStr="+nonce_str+"&package="+packages+"&sign="+finalsign);
model.addAttribute("appid", WxPayConfig.appid);
model.addAttribute("timeStamp", timestamp);
model.addAttribute("nonceStr", nonce_str);
model.addAttribute("packageValue", packages);
model.addAttribute("sign", finalsign);
model.addAttribute("bizOrderId", orderId);
model.addAttribute("orderId", orderId);
model.addAttribute("payPrice", total_fee);
System.out.println("orderId:---------------"+orderId);
return "/jsapi";
} catch (NumberFormatException e) {
e.printStackTrace();
}
return null;
}
微信公众号支付java版本的更多相关文章
- 微信公众号支付开发全过程 --JAVA
按照惯例,开头总得写点感想 ------------------------------------------------------------------ 业务流程 这个微信官网说的还是很详细的 ...
- 到处是坑的微信公众号支付开发(java)
之前公司项目开发中支付是用阿里的支付做的,那叫一个简单,随意:悲催的是,现在公司开发了微信公众号,所以我步入了全是坑的微信支付开发中... ------------------------------ ...
- 微信公众号支付备忘及填坑之路-java
一.背景 最近公司给第三方开发了一个公众号,其中最重要的功能是支付,由于是第一次开发,遇到的坑特别的多,截止我写博客时,支付已经完成,在这里我把遇到的坑记录一下(不涉及退款).不得不吐槽一下,腾讯这么 ...
- java版微信公众号支付(H5调微信内置API)
最近需要做微信公众号支付,网上找了大堆的代码,大多都只说了个原理,自己踩了太多坑,所有的坑,都会再下面的文章中标注,代码我也贴上最全的(叫我雷锋)!!! 第一步:配置支付授权目录 你需要有将你公司的微 ...
- 微信公众号支付(JSAPI)对接备忘
0 说明 本文里说的微信公众号支付对接指的是对接第三方支付平台的微信公众号支付接口. 非微信支付官方文档里的公众号支付开发者文档那样的对接.不过,毕竟腾讯会把一部分渠道放给银行或有支付牌照的支付机构, ...
- 微信公众号支付调用chooseWXPay提示“errmsg choosewxpay fail”
微信公众号支付一直提示“errmsg choosewxpay fail”,也没有提示具体错误信息,签名没有问题(签名验证地址:https://pay.weixin.qq.com/wiki/doc/ap ...
- 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结
最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...
- thinkphp.2 thinkphp5微信支付 微信公众号支付 thinkphp 微信扫码支付 thinkphp 微信企业付款5
前面已经跑通了微信支付的流程,接下来吧微信支付和微信企业付款接入到thinkphp中,版本是3.2 把微信支付类.企业付款类整合到一起放到第三方类库,这里我把微信支付帮助类和企业付款类放到同一个文件了 ...
- 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵):这会儿难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些“暗坑”能不 ...
随机推荐
- Hibernate课程 初探一对多映射4-3 测试--信息查询
建立双向一对多关系,既可以由一方查询多方信息,同样可以由多方查询一方信息 demo: //查询学生所在班级 public static void showGidByStudent(){ Session ...
- 应该知道的一些Markdown语法
目录 快速输入标题 斜体和粗体,删除线 分隔线 外链接 无序列表 有序列表 定义型列表 插入图片 文字引用 标签分类 表格 行内代码块 代码段 注脚 待办事宜 Todo 列表 显示当前文章的目录 快速 ...
- 2602 最短路径问题Dihstra算法
题目描述 Description 平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间.其中的一些点之间有连线.若有连线,则表示可从一个点到达另一个点,即两点间有通路,通 ...
- 关于 header()前面 为什么不能有任何输出的问题
之前有个问题就是在header () 之前输出,并没有任何报错信息. header() 官网定义必须在任何实际输出之前调用,不管是普通的HTML标签,还是文件或PHP输出的空行,空格.在测试的时候发现 ...
- vue安装--使用node
总结: # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpack my-proj ...
- 使用GreenDao 添加字段,删除表,新增表操作
GreenDao 给我个人感觉 比一般的ORM框架要好很多,虽然说上手和其他的比起来,较复杂,但是如果使用熟练以后,你会爱上这个框架的 用这些ORM 框架给我的感觉都是,当升级时,都需要进行数据库所有 ...
- tomcat的相关使用
tomcat服务器是apache下非常优秀的一款web服务器,当今的互联网企业中90%左右的中小型企业使用的都是tomcat.tomcat在部署项目时有很多很多的解决方案,这些你都清楚吗? 1.同一个 ...
- senium
http://webdriver.googlecode.com 所以CTRL属于Modifier Key,需要这样写: Actions actionObject = new Actions(drive ...
- 拼接sql语句时拼接空字符串报sql错误
先上代码(php): $id_card=""; $sql = "select * from people where id_card=".$id_card; 看 ...
- 笨办法学Python(二十七)
习题 27: 记住逻辑关系 到此为止你已经学会了读写文件,命令行处理,以及很多 Python 数学运算功能.今天,你将要开始学习逻辑了.你要学习的不是研究院里的高深逻辑理论,只是程序员每天都用到的让程 ...