java程序支付宝接口付费功能的实现

Wesley13
• 阅读 494

以前做过c#应用程序支付宝api接口功能,现在转移到Java程序上,代码如何实现呢? 1、从你的网站提交到支付宝:

/** * 将订单提交支付宝进行网上支付 */ public ActionForward submitAlipayUrl(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String orderNo = request.getParameter("orderNo");//订单编号 HashMap hm = new HashMap(); hm.put("_input_charset", "utf-8");// 采用相同的编码方式 hm.put("body", "企鹅个性化图书订单,订单号:" + orderNo);// 填写在跳到支付宝页面上显示的付款内容信息 hm.put("notify_url", "http://127.0.0.1:8888/mypenguin/orders.do?method=AlipayNotify");// 客户付款后,支付宝调用的页面 hm.put("out_trade_no", orderNo);// 外部交易号,最好具有唯一性,在获取支付宝发来的付款信息时使用. hm.put("partner", "2088002302055380");// partnerId(合作伙伴ID) //hm.put("agent", "2088002302055380");// partnerId(合作伙伴ID) hm.put("payment_type", "1");// 支付类型 1=商品购买,2=服务购买,... //hm.put("price", "178.00");// 订单金额信息 hm.put("total_fee", "178.00");// 订单金额和信息 //hm.put("quantity", "1");// 订单商品数量,一般都是写1,它是按照整个订单包来计算 hm.put("return_url", "http://127.0.0.1:8888/mypenguin/orders.do?method=AlipayReturn");// 客户付款成功后,显示给客户的页面 hm.put("show_url", "http://127.0.0.1:8888/mypenguin/books.do?method=list&kindId=1");//展示地址,即在支付页面时,商品名称旁边的“详情”的链接地址。 hm.put("seller_email", "monicali_7766@sina.com");// 你的支付宝账户email hm.put("service", "create_direct_pay_by_user");// create_direct_pay_by_user=直接付款,trade_create_by_buyer=担保付款 hm.put("subject", "企鹅个性化图书订单号:" + orderNo);// 填写在跳到支付宝页面上显示的付款标题信息 String payGateway = "https://www.alipay.com/cooperate/gateway.do";// 跳转到支付宝的url头 String securityCode="7nj9sczcnfc4n8366j46mrzsbqjksmzn";//securityCode(安全码); String sign = makeUrl(hm,securityCode,"utf-8",payGateway);//securityCode(安全码); hm.put("sign", sign); hm.put("sign_type", "MD5"); PrintWriter out = response.getWriter();

    out.println("<form name='alipaysubmit' method='post'  action='https://www.alipay.com/cooperate/gateway.do?_input_charset=utf-8' >");
    out.println("<input type='hidden' name='service' value='" + hm.get("service") + "'>");
    out.println("<input type='hidden' name='partner' value='" + hm.get("partner") + "'>");
    out.println("<input type='hidden' name='seller_email' value='" + hm.get("seller_email") + "'>"); 

out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); return null; }

/** * 根据传入的参数生成Alipay的支付URL * @param hm 参数值 * @param securityCode 安全码 * @param charset 编码 * @param payGateway 支付宝gateway

  • @return */ public static String makeUrl(HashMap hm,String securityCode,String charSet,String payGateway) throws Exception{ List keys = new ArrayList(hm.keySet()); Collections.sort(keys);//支付宝要求参数必须按字母排序 StringBuffer content = new StringBuffer(); for (int i = 0; i < keys.size(); i++) { content.append((String) keys.get(i)); content.append("="); content.append((String) hm.get((String) keys.get(i))); if (i != keys.size() - 1) { content.append("&"); } } content.append(securityCode);
    String sign = DataUtil.MD5Encode(content.toString(), charSet); //MD5加密 return sign; }

2、return_url的内容: /** * 支付宝支付完成以后,当前窗口会从支付宝的页面跳转回这个页面。该页面称作“返回页”, * 是同步被支付宝服务器所调用,可当作是支付完成后的提示信息页,如“您的某某某订单,多少金额已支付成功”。 */ public ActionForward AlipayReturn(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify"; //String alipayNotifyURL = "http://notify.alipay.com/trade/notify_query.do?";//此路径是在上面链接地址无法起作用时替换使用。 alipayNotifyURL = alipayNotifyURL+ "&partner=2088002302055380&notify_id="+ request.getParameter("notify_id"); // 获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的 String responseTxt = check(alipayNotifyURL); // 获得POST 过来参数设置到新的requestParams中 Map requestParams = request.getParameterMap(); List keys = new ArrayList(requestParams.keySet()); Collections.sort(keys); StringBuffer content = new StringBuffer(); for (int i = 0; i < keys.size(); i++) { String key=(String) keys.get(i); if(!key.equals("")&&!key.equals("sign")&&!key.equals("sign_type")){ content.append((String) keys.get(i)); content.append("="); content.append((String)requestParams.get((String) keys.get(i))); if (i != keys.size() - 1) { content.append("&");
} } } String securityCode="7nj9sczcnfc4n8366j46mrzsbqjksmzn";//securityCode(安全码); content.append(securityCode); String mysign = DataUtil.MD5Encode(content.toString(), "utf-8"); System.out.println("--------------------------content="+content); System.out.println("--------------------------mysign="+mysign); System.out.println("--------------------------sign="+request.getParameter("sign")); if (mysign.equals(request.getParameter("sign")) && responseTxt.equals("true") ){ if (request.getParameter("trade_status").equalsIgnoreCase("TRADE_FINISHED")){ // 可以做重定向,也可以用来虚拟物品发货 } return mapping.findForward("payOK");//交易成功 }else{ return mapping.findForward("payFail");//交易失败 } }

3、notify_url的内容: /** * 通知返回URL,仅适用于异步返回处理结果的接口。有些服务是无法立即返回处理结果的,那么需要通过这个URL将处理结果异步返回给合作伙伴 */ public ActionForward AlipayNotify(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify"; //String alipayNotifyURL = "http://notify.alipay.com/trade/notify_query.do?";//此路径是在上面链接地址无法起作用时替换使用。 alipayNotifyURL = alipayNotifyURL+ "&partner=2088002302055380&notify_id="+ request.getParameter("notify_id"); // 获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的 String responseTxt = check(alipayNotifyURL); // 获得POST 过来参数设置到新的requestParams中 Map requestParams = request.getParameterMap(); List keys = new ArrayList(requestParams.keySet()); Collections.sort(keys); StringBuffer content = new StringBuffer(); for (int i = 0; i < keys.size(); i++) { String key=(String) keys.get(i); if(!key.equals("")&&!key.equals("sign")&&!key.equals("sign_type")){ content.append((String) keys.get(i)); content.append("=");
content.append((String)requestParams.get((String) keys.get(i))); if (i != keys.size() - 1) { content.append("&"); } } } String securityCode="7nj9sczcnfc4n8366j46mrzsbqjksmzn";//securityCode(安全码); content.append(securityCode); String mysign = DataUtil.MD5Encode(content.toString(), "utf-8"); System.out.println("--------------------------content="+content); System.out.println("--------------------------mysign="+mysign); System.out.println("--------------------------sign="+request.getParameter("sign")); if (mysign.equals(request.getParameter("sign")) && responseTxt.equals("true") ){ if (request.getParameter("trade_status").equalsIgnoreCase("TRADE_FINISHED")){ // 可以做重定向,也可以用来虚拟物品发货 } return mapping.findForward("payOK"); }else{ return mapping.findForward("payFail"); } }

/**

  • @param myUrl *
    • @param url

    • @return 获取url内容 */ public static String check(String urlvalue ) {

String inputLine = ""; try { URL url = new URL(urlvalue); HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();

BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));

String stTemp = ""; while((stTemp = in.readLine()) != null) { System.out.println(stTemp); inputLine = inputLine + stTemp; } } catch(Exception e) { e.printStackTrace(); } return inputLine; } 代码编写完毕,可以试着debug调试一下

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这