免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6679 | 回复: 1
打印 上一主题 下一主题

微信支付java 服务端实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-15 09:51 |只看该作者 |倒序浏览
代码:
  1. //操蛋的微信demo 和文档不对应无法跑起来,文档写的就是一拖狗屎。不想喷了,直接看代码。



  2. RequestHandler requestHandler = new RequestHandler(super.getRequest(),super.getResponse());

  3. //获取token //两小时内有效,两小时后重新获取

  4. Token = requestHandler.GetToken();

  5. //更新token 到应用中

  6. requestHandler.getTokenReal();

  7. System.out.println("微信支付获取token=======================:" +Token);



  8. //requestHandler 初始化

  9. requestHandler.init();

  10. requestHandler.init(appid,appsecret, appkey,partnerkey, key);



  11. // --------------------------------本地系统生成订单-------------------------------------

  12. // 设置package订单参数  

  13.     SortedMap<String, String> packageParams = new TreeMap<String, String>();  

  14.     packageParams.put("bank_type", "WX"); // 支付类型  

  15.     packageParams.put("body", "xxxx"); // 商品描述  

  16.     packageParams.put("fee_type", "1"); // 银行币种  

  17.     packageParams.put("input_charset", "UTF-8"); // 字符集  

  18.     packageParams.put("notify_url", "http://xxxx.com/xxxx/wxcallback"); // 通知地址  这里的通知地址使用外网地址测试,注意80端口是否打开。

  19.     packageParams.put("out_trade_no", no); // 商户订单号  

  20.     packageParams.put("partner", partenerid); // 设置商户号  

  21.     packageParams.put("spbill_create_ip", super.getRequest().getRemoteHost()); // 订单生成的机器IP,指用户浏览器端IP  

  22.     packageParams.put("total_fee", String.valueOf(rstotal)); // 商品总金额,以分为单位  



  23. // 设置支付参数  

  24.     SortedMap<String, String> signParams = new TreeMap<String, String>();  

  25.     signParams.put("appid", appid);  

  26.     signParams.put("noncestr", noncestr);  

  27.     signParams.put("traceid", PropertiesUtils.getOrderNO());  

  28.     signParams.put("timestamp", timestamp);  

  29.     signParams.put("package", packageValue);  

  30.     signParams.put("appkey", this.appkey);



  31.     // 生成支付签名,要采用URLENCODER的原始值进行SHA1算法!  

  32.     String sign ="";

  33.         try {

  34.         sign = Sha1Util.createSHA1Sign(signParams);

  35.         } catch (Exception e) {

  36.         e.printStackTrace();

  37.         }  

  38.       

  39.     // 增加非参与签名的额外参数  

  40.     signParams.put("sign_method", "sha1");  

  41.     signParams.put("app_signature", sign);  

  42.    

  43.       

  44.     // api支付拼包结束------------------------------------  

  45.    

  46.     //获取prepayid

  47.     String prepayid = requestHandler.sendPrepay(signParams);

  48.     System.out.println("prepayid :" + prepayid);





  49.    

  50. // --------------------------------生成完成---------------------------------------------  

  51.    

  52. //生成预付快订单完成,返回给android,ios 掉起微信所需要的参数。

  53.     SortedMap<String, String> payParams = new TreeMap<String, String>();  

  54.     payParams.put("appid", appid);

  55.     payParams.put("noncestr", noncestr);

  56.     payParams.put("package", "Sign=WXPay");

  57.     payParams.put("partnerid", partenerid);

  58.     payParams.put("prepayid", prepayid);

  59.     payParams.put("appkey", this.appkey);

  60.    //这里除1000 是因为参数长度限制。

  61.     int time = (int) (System.currentTimeMillis() / 1000);

  62.     payParams.put("timestamp",String.valueOf(time));

  63.    

  64.     System.out.println("timestamp:" + time);

  65.    

  66.    //签名

  67.     String paysign ="";

  68.     try {

  69.                 paysign = Sha1Util.createSHA1Sign(payParams);

  70.     } catch (Exception e) {

  71.         e.printStackTrace();

  72.     }

  73.     payParams.put("sign", paysign);

  74.    

  75.   //拼json 数据返回给客户端

  76.     BasicDBObject backObject = new BasicDBObject();

  77.     backObject.put("appid", appid);

  78.     backObject.put("noncestr", payParams.get("noncestr"));

  79.     backObject.put("package", "Sign=WXPay");

  80.     backObject.put("partnerid", payParams.get("partnerid"));

  81.     backObject.put("prepayid", payParams.get("prepayid"));

  82.     backObject.put("appkey", this.appkey);

  83.     backObject.put("timestamp",payParams.get("timestamp"));

  84.     backObject.put("sign",payParams.get("sign"));

  85.    

  86.     String backstr = dataObject.toString();

  87.     System.out.println("backstr:" + backstr);



  88.     return backstr;



  89.   ====================到此为止,预付款订单已生成,并且已返回客户端====================



  90.                   //坐等微信服务器通知,通知的地址就是生成预付款订单的notify_url



  91.     ResponseHandler resHandler = new ResponseHandler(request, response);

  92.     resHandler.setKey(partnerkey);

  93.     //创建请求对象

  94.     //RequestHandler queryReq = new RequestHandler(request, response);

  95.     //queryReq.init();

  96.     if (resHandler.isTenpaySign() == true) {

  97.             //商户订单号

  98.             String out_trade_no = resHandler.getParameter("out_trade_no");

  99.             System.out.println("out_trade_no:" + out_trade_no);

  100.             //财付通订单号

  101.             String transaction_id = resHandler.getParameter("transaction_id");

  102.             System.out.println("transaction_id:" + transaction_id);

  103.             //金额,以分为单位

  104.             String total_fee = resHandler.getParameter("total_fee");

  105.             //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee

  106.             String discount = resHandler.getParameter("discount");

  107.             //支付结果

  108.             String trade_state = resHandler.getParameter("trade_state");

  109.    

  110.             //判断签名及结果

  111.             if ("0".equals(trade_state)) {

  112.                 //------------------------------

  113.                 //即时到账处理业务开始

  114.                 //------------------------------

  115.             

  116.                 System.out.println("----------------业务逻辑执行-----------------");

  117.            

  118.                 //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

  119.                 System.out.println("----------------业务逻辑执行完毕-----------------");

  120.                 System.out.println("success"); // 请不要修改或删除

  121.             

  122.                 System.out.println("即时到账支付成功");

  123.                 //给财付通系统发送成功信息,财付通系统收到此结果后不再进行后续通知

  124.                 resHandler.sendToCFT("success");

  125.      

  126.              //给微信服务器返回success 否则30分钟通知8次

  127.              return "success";

  128.          }else{            

  129.             System.out.println("通知签名验证失败");

  130.             resHandler.sendToCFT("fail");

  131.             response.setCharacterEncoding("utf-8");

  132.         }

  133.      }else {

  134.             System.out.println("fail -Md5 failed");  

  135.     }
复制代码

论坛徽章:
80
20周年集字徽章-庆
日期:2020-10-28 14:09:1215-16赛季CBA联赛之北京
日期:2020-10-28 13:32:5315-16赛季CBA联赛之北控
日期:2020-10-28 13:32:4815-16赛季CBA联赛之天津
日期:2020-10-28 13:13:35黑曼巴
日期:2020-10-28 12:29:1520周年集字徽章-周	
日期:2020-10-31 15:10:0720周年集字徽章-20	
日期:2020-10-31 15:10:07ChinaUnix元老
日期:2015-09-29 11:56:3020周年集字徽章-年
日期:2020-10-28 14:14:56
2 [报告]
发表于 2015-07-15 11:24 |只看该作者
我里个去  看招就头晕
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP