微信公众号支付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等错误解决方法
这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵):这会儿难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些“暗坑”能不 ...
随机推荐
- .NET面试题4
常见面试题目: 1.字符串是引用类型类型还是值类型? 2.在字符串连接处理中,最好采用什么方式,理由是什么? 3.使用 StringBuilder时,需要注意些什么问题? 4.以下代码执行后内存中会存 ...
- 基于JQUERY 的图片查看插件
viewer是一款功能强大的图片查看器.它可以实现ACDsee等看图软件的部分功能.它可以对图片进行移动,缩放,旋转,翻转,可以前后浏览一组图片.该图片查看器还支持移动设备,支持键盘控制,功能十分强大 ...
- 添加、修改、删除XML节点代码例子
version="1.0" encoding="gb2312"?> . <bookstore> . <book genre=" ...
- xml schema数据类型
1.简单数据类型 (1)内置简单数据类型 schema中定义了一些简单数据类型,包括primitive原始数据类型和derived派生数据类型,这些类型都是schema中使用的 最基本的数据类型,我们 ...
- Python基本操作之文件操作
一. 1.文件操作的函数 open("文件名字(路径)",mode="模式",encoding="字符集") 2.模式:r,w,a,r+,w ...
- Python之人工智能:PyAudio 实现录音 自动化交互实现问答
Python 很强大其原因就是因为它庞大的三方库 , 资源是非常的丰富 , 当然也不会缺少关于音频的库 关于音频, PyAudio 这个库, 可以实现开启麦克风录音, 可以播放音频文件等等,此刻我们不 ...
- Android Studio 导入 AOSP 源码
有了 AOSP 源码,接下来就是如何看了,可以直接文本看,可以用 Source Insight,我当然选择 Android Studio,Android Studio 是我熟悉且十分强大的工具.问题来 ...
- Python 爬虫实战(二):使用 requests-html
Python 爬虫实战(一):使用 requests 和 BeautifulSoup,我们使用了 requests 做网络请求,拿到网页数据再用 BeautifulSoup 解析,就在前不久,requ ...
- Javascript基础--函数(Function对象)
1.函数是一段可执行的代码,函数可多次调用,模块化管理. 2.使用function语句,function funName([arg1][,arg2]....[,argn]){代码块}.所有版本可用,一 ...
- linq 和 lmabda 表达式 的用法 和优劣 转自 农码一生
https://www.cnblogs.com/zhaopei/p/5746414.html