支付宝接口实现_HiBoyljw的博客-程序员宅基地

技术标签: JAVA  

 * 将订单提交支付宝进行网上支付
 */
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", "[email protected]");// 你的支付宝账户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("<input type='hidden' name='out_trade_no' value='" + hm.get("out_trade_no") + "'>"); out.println("<input type='hidden' name='subject' value='" + hm.get("subject") + "'>"); out.println("<input type='hidden' name='body' value='" + hm.get("body") + "'>"); out.println("<input type='hidden' name='total_fee' value='" + hm.get("total_fee") + "'>"); out.println("<input type='hidden' name='show_url' value='" + hm.get("show_url") + "'>"); out.println("<input type='hidden' name='return_url' value='" + hm.get("return_url") + "'>"); out.println("<input type='hidden' name='notify_url' value='" + hm.get("notify_url") + "'>"); out.println("<input type='hidden' name='payment_type' value='1'>"); out.println("<input type='hidden' name='sign' value='" + hm.get("sign") + "'>"); out.println("<input type='hidden' name='sign_type' value='" + hm.get("sign_type") + "'>"); out.println("</form>"); out.println("<script>"); out.println(" document.alipaysubmit.submit()"); out.println("</script>"); 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调试一下

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/HiBoyljw/article/details/58585539

智能推荐

pwgen命令生成密码_点点2B的博客-程序员宅基地_pwgen命令

生成脚本if [ "$1" == "" ];then pwgen -s -c -n -y 12 -B -r \'\\\" else pwgen -s -c -n -y 12 -B -r \'\\\" $1 fi生成的密码中排除了指定的字符,如单引号,双引号等使用方式:./pwgen.sh 密码个数如:[[email protected] ~]# ./pwgen.sh 20g_R]9~w9j}bC 3+//.YP7#%]b [nUF3R-y$&amp;u` |s[Pyr4)=roJ *W

AtCoder Beginner Contest 174 F.Range Set Query_旺 崽的博客-程序员宅基地

AtCoder Beginner Contest 174 F.Range Set Query题目链接第一次碰到不考思维的 FFF,我笑了????这题就是一个主席树的应用,裸题+原题,注意此题比原题数据大了一倍多,所以线段树的大小也要扩大,我因为这个 RE 了好几次????,AC代码如下:#include&lt;bits/stdc++.h&gt;using namespace std;const int maxn = 5e5+5;int n, m;struct Tree { int

题目52:输入两个正整数m和n,判断m和n是否互质(即最大公约数为1),是则输出Yes,否则输出No。_爱吃菜菜的小女孩的博客-程序员宅基地

Python 输入两个正整数m和n,判断m和n是否互质(即最大公约数为1),是则输出Yes,否则输出No。

python 支持向量机预测_Python 机器学习之 SVM 预测买卖_weixin_39821378的博客-程序员宅基地

Python 机器学习之 SVM 预测买卖Python 机器学习之 SVM 预测买卖Author: Zero, Date: 2016-09-13 17:55:54Tags: Python 机器学习Python入门简单策略 sklearn 机器学习库的使用回测系统自带的库有numpy pandas TA-Lib scipy statsmodels sklearn cvxopt hmmlearn py...

一些图像处理函数用法_weixin_33831196的博客-程序员宅基地

% imshowimshow是用来显示图片的,如&gt;&gt; I = imread('moon.tif');&gt;&gt; figure,imshow(I);而有时为了数据处理,要把读取的图片信息转化为更高的精度,&gt;&gt; I = double(imread('moon.tif'));为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变...

Vmware 虚拟机网络通讯_解酒的李白的博客-程序员宅基地

原文地址 :https://blog.csdn.net/u011127242/article/details/83684972VMware Workstation(中文名“威睿工作站”)是一款功能强大的桌面虚拟计算机软件,提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发、测试 、部署新的应用程序的最佳解决方案。其使用过程中的网络连接是一个比较重要的问题,笔者本文针对VM的网络通信的...

随便推点

java paint里有super有什么区别_在java中使用super.paintComponent(g)或getGraphics()_杰克波比的博客-程序员宅基地

关于一些事情,我有点困惑:示例代码,显示我的问题,这是不可编译的// imageprivate BufferedImage image;private Graphics2D graphic;private changeImage;. . .//thread loopwhile (running) {. . .render();Graphics showGraphic = getGraphics()...

selenium+python面试题目总结_dongdou7287的博客-程序员宅基地

1. WebDriver原理webDriver是按照client/server模式设计,client就是我们的测试代码,发送请求,server就是打开的浏览器来打开client发出的请求并做出响应。具体的工作流程:·webdriver打开浏览器并绑定到指定端口。启动的浏览器作为remote server.·client通过commandExecuter发送httpRequ...

linux批量杀进程_Linux下批量杀掉筛选进程_weixin_39757122的博客-程序员宅基地

1. 使用awk批量杀进程的命令碰到需要杀掉某一类进程的时候,如何批量杀掉这些进程,使用awk命令是很好的选择。ps -ef|grep xxx|grep -v grep就是从当前系统运行的进程的进程名中帅选包含xxx关键字的进程awk ‘pattern {action}’print是打印,kill -9 是强制停止进程的命令, $2就是前面有ps -ef命令得出的结果的第二列上显示的内容ps -e...

RecyclerView item多布局显示新姿势_从技术到艺术的博客-程序员宅基地

问题RecyclerView正在逐渐取代ListView,在使用RecyclerView中遇到了一个问题,需要在RecyclerView的固定位置设置不同布局的特殊Item,其中最大的问题在于不同类型data和View布局如何进行正确对应。思路将需要显示的不同类型数据都放到同一个容器中显示时根据不同的类型加载不同的布局实现在使用RecyclerView时最重要的一...

重生日记_u011886490的博客-程序员宅基地

人之于宇宙,尚不如蚊子之于地球 ;地球的渺小,对整个时间和空间是我这句话都不用写的生命不是碌碌无为的线段,欣喜的开始,突兀的结束;或者行尸走肉的存在证明生命是造物者的恩宠,宇宙的奇迹;恩宠奇迹是有感情的,毕竟我还是还找不出一个毫无主观感情的词来形容我的存在是多么的无法想象人发育成一个皮毛肉骨的存在,是从一个受精卵开始 ,个体的每一个细胞都保存着这个生命所有的信息:个体的每一个细胞都有望发育成一个新

关于element tree树默认展开几级_黑豆1024的博客-程序员宅基地_eltree默认展开二级

前言:今天不加班了,写点代码吧…突然心血来潮想把遇见的这个小功能点加到博客里这里主要用到了 node-key=“id” 跟 :default-expanded-keys=“defaultShowNodes” 这两个属性第一个是根据绑定的字段来保证每一项数据的唯一性 第二个是默认展开的数组id我这里是自己写了个递归来实现具体代码废话不多说 开始展示代码 &lt;el-tree ref="tree" :data="studentTree" :highligh

推荐文章

热门文章

相关标签