博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
支付宝支付之电脑网站支付与SpringMvc整合
阅读量:5963 次
发布时间:2019-06-19

本文共 7122 字,大约阅读时间需要 23 分钟。

支付宝开放平台下载alipay-java-sdk

https://open.alipay.com

 

目前官方没有提供maven,下载sdk后,可以用maven命令安装到本地仓库,执行如下命令

mvn install:install-file -DgroupId=com.alipay -DartifactId=alipay-sdk-java -Dversion=xxx -Dpackaging=jar -Dfile=D:\alipay-sdk-javaxxx.jar

 

项目增加maven配置

com.alipay
alipay-sdk-java
xxx

 

 

前端付款界面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%--
--%>

 

 

增加一个AlipayConfig

package com.zns.pay.alipay;public class AlipayConfig {        // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号    public static String app_id = "";        // 商户私钥,您的PKCS8格式RSA2私钥    public static String merchant_private_key = "";        // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。    public static String alipay_public_key = "";    // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问    public static String notify_url = "http://domain.com/AliPay/notifyUrl";    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问    public static String return_url = "http://domain.com/AliPay/returnUrl";    // 签名方式    public static String sign_type = "RSA2";        // 字符编码格式    public static String charset = "utf-8";        // 支付宝网关    public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";}

 

 

后台控制器代码

package com.zns.controller;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.alipay.api.AlipayClient;import com.alipay.api.DefaultAlipayClient;import com.alipay.api.internal.util.AlipaySignature;import com.alipay.api.request.AlipayTradePagePayRequest;import com.zns.pay.alipay.AlipayConfig;@Controller@RequestMapping("/AliPay")public class AliPayController {        protected final Logger logger = Logger.getLogger(AliPayController.class);        @RequestMapping("/pay")    public void pay(HttpServletRequest request,HttpServletResponse response) throws Exception {        //获得初始化的AlipayClient        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);                //设置请求参数        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();        alipayRequest.setReturnUrl(AlipayConfig.return_url);        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);                //商户订单号,商户网站订单系统中唯一订单号,必填        String out_trade_no =String.valueOf(new Date().getTime());        //销售产品码,与支付宝签约的产品码名称。 注:目前仅支持FAST_INSTANT_TRADE_PAY        String product_code="FAST_INSTANT_TRADE_PAY";        //付款金额,必填        String total_amount = "0.01";        //订单名称,必填        String subject = "订单"+String.valueOf(new Date().getTime());        //商品描述,可空        String body = "";                alipayRequest.setBizContent(""                + "{"                + "\"out_trade_no\":\""+ out_trade_no +"\","                 + "\"product_code\":\""+ product_code +"\","                + "\"total_amount\":\""+ total_amount +"\","                 + "\"subject\":\""+ subject +"\","                                + "\"body\":\""+ body +"\""                 + "}"                );        //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节                //调用SDK生成表单        String form = alipayClient.pageExecute(alipayRequest).getBody();        response.setContentType("text/html;charset=utf-8");         response.getWriter().println(form);    }        @RequestMapping(value="/pay2",produces = "application/text;charset=utf-8")    @ResponseBody    public String pay2(HttpServletRequest request,HttpServletResponse response) throws Exception {        //代码和上面一样                //调用SDK生成表单        //String form = alipayClient.pageExecute(alipayRequest).getBody();        String form="";        return form;    }        /**     * 支付宝服务器同步通知url     */    @RequestMapping(value="/returnUrl")    public String returnUrl(HttpServletRequest request,HttpServletResponse response){        logger.info("支付宝服务器同步通知url...");        //处理逻辑省略...        return "web/pay/success";    }        /**     * 支付宝服务器异步通知url     * @throws Exception      */    @RequestMapping(value="/notifyUrl")    public void notifyUrl(HttpServletRequest request,HttpServletResponse response) throws Exception{        logger.info("进入支付宝服务器异步通知url...");        //获取支付宝POST过来的信息        Map
params = new HashMap
(); Map
requestParams = request.getParameterMap(); for (Iterator
iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } //乱码解决,这段代码在出现乱码时使用 //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); } //调用SDK验证签名 boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //——请在这里编写您的程序(以下代码仅作参考)—— /* 实际验证过程建议商户务必添加以下校验: 1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号, 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email) 4、验证app_id是否为该商户本身。 */ if(signVerified) {
//验证成功 //商户订单号 String out_trade_no =request.getParameter("out_trade_no"); //支付宝交易号 String trade_no =request.getParameter("trade_no"); //交易状态 String trade_status =request.getParameter("trade_status"); if(trade_status.equals("TRADE_FINISHED")){ //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //退款日期超过可退款期限后(如三个月可退款),支付宝系统会发送该交易状态通知 }else if (trade_status.equals("TRADE_SUCCESS")){ //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //付款完成后,支付宝系统会发送该交易状态通知 } //记录日志信息 }else {
//验证失败 //调试用,记录日志信息 //Logger.error(AlipaySignature.getSignCheckContentV1(params)); } }}

 

转载于:https://www.cnblogs.com/zengnansheng/p/10389766.html

你可能感兴趣的文章
redis主从配置<转>
查看>>
8 行 Node.js 代码实现代理服务器
查看>>
水印,图片验证码
查看>>
C#编程(七十六)----------使用指针实现基于栈的高性能数组
查看>>
PostgreSql 分页limit
查看>>
在MySQL中创建cm-hive使用的数据库及账号
查看>>
HDU 2503 a/b + c/d(最大公约数与最小公倍数,板子题)
查看>>
python总结
查看>>
hdu 5215 Cycle
查看>>
GCD学习(五) dispatch_barrier_async
查看>>
file_get_contents("php://input")的使用方法
查看>>
MeasureSpec学习
查看>>
Android View体系(五)从源码解析View的事件分发机制
查看>>
数据结构 之 并查集(Disjoint Set)
查看>>
枚举类的创建和使用
查看>>
如何改变Myeclipse编辑区背景色(转)
查看>>
深入浅出LVM on linux
查看>>
转载 C++实现的委托机制
查看>>
编辑框CEdit自动换行简单设置
查看>>
很实用的小功能,通过配置Web.xml让点击文件路径的超链接,直接下载而不会在浏览器上尝试打开...
查看>>