精华内容
下载资源
问答
  • 支付宝生活对接-----(一)授权

    万次阅读 2019-02-21 20:51:00
    第一次做支付宝生活号, 一脸蒙蔽, 在同事的帮助下勉强做出来了,下面分享一下沙箱环境的应用,正式和沙箱是一样的 因为我是直接有了支付宝生活号,并且已经添加了应用 ,所以我直接从配置开始说起 在按照下面步骤做...

    第一次做支付宝生活号, 一脸蒙蔽, 在同事的帮助下勉强做出来了,下面分享一下沙箱环境的应用,正式和沙箱是一样的

    因为我是直接有了支付宝生活号,并且已经添加了应用 ,所以我直接从配置开始说起

    在按照下面步骤做之前 最好先了解一下支付宝授权过程,

    https://docs.open.alipay.com/263/105809/ 

    这个上面有详细的介绍

    下面的步骤与介绍基本一致, 不过详细一点

    下面所有的步骤只为了支付宝授权 获取userId

    通过地址调用 来进行静默授权或者非静默授权

    拼接授权页面url: 以及参数说明

     正式环境:

    https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=商户的APPID&scope=auth_user&redirect_uri=ENCODED_URL&state=init

    沙箱环境:

    https://openapi.alipaydev.com/oauth2/publicAppAuthorize.htm?app_id=商户的APPID&scope=auth_user&redirect_uri=ENCODED_URL&state=init

    另外注意网关:

    切换沙箱环境时,除了支付宝网关https://openapi.alipay.com/gateway.do需要切换成https://openapi.alipaydev.com/gateway.do之外,还需要将

    切换沙箱环境时,除了支付宝网关https://openapi.alipay.com/gateway.do需要切换成https://openapi.alipaydev.com/gateway.do之外,还需要将

     

     

    第一步:创建应用

    此步骤省略

    第二步:配置密钥

     https://docs.open.alipay.com/291/105971/

    下载生成密钥以及公钥的工具 

    生成之后,

    https://openhome.alipay.com/platform/appDaily.htm j进入沙箱环境

    这时候可以看到上面访问需要授权的很多配置

    这些配好了就可以准备粘贴代码了

    public class AlipayServiceEnvConstants2 {
    
        /**支付宝公钥-从支付宝生活号详情页面获取*/
    	public static final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAquvU1bcCLHpSjnEq9s9diJGTkb5QLwGpJSDxUtQI5+D2RrvouJJsTQC/iueK02kPhEsO9V7qSK2RI74nEc6IMntnC5npj0InfsX6nAJpjZBVR03qfJeWeE1aJ6aD7AvPSrZWGHGKLU7eo2OU0DnDAje/aHZc6cIQrUWDPbP+y/bKF1bU7Q3aLrUF8/MnGBtHZ+uPjkeIMy9FXBWcwn6U8GkFaomoJX9Pv/C94Mh3oxWRd3eernc0Vk4ZJHVEksNIB9ffKXxWgXvpaiXjxZoperxoDXDkh/P/32KCV4GFEoU9wMN8Qb7smKLS8R+EzmdoaFVKoLP9AZWg5luZmBAOyQIDAQAB";
        
        /**签名编码-视支付宝服务窗要求*/
        public static final String SIGN_CHARSET      = "GBK";
    
        /**字符编码-传递给支付宝的数据编码*/
        public static final String CHARSET           = "GBK";
    
        /**签名类型-视支付宝服务窗要求*/
        public static final String SIGN_TYPE         = "RSA2";
        
        /**开发者账号PID*/
        public static final String PARTNER           = "2088621459192115";
    
        /** 服务窗appId  */
        //TODO !!!! 注:该appId必须设为开发者自己的生活号id  
        public static final String APP_ID            = "2016080300159887";
    
        //私钥
        public static final String PRIVATE_KEY       = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPBcM4F9wqLbsMSVQJkfMFHSk/m58ihiLWX3ITH9F26oBvKXc0ozdQwGGCIThnYLeGgeNqg5scqV20PcFkeiFaaBJd2TgGktGCbgaSpGMy6en9BeShIgl6U99FlLnbz2kXLUWnsSSJr/0uEoM0y4cPzgHet86HGJCSS6GDqWdaeODclZ8xywMWI/79v/u6qQbsN7QwdV7fS6qCZjqaBCR2/CyJTzjm6lFkaXNNxRKlwZipkUfTTWiiEIu7kD7OAq8xVRT4DZP0AMAyCC6GDDTyNJ6VV7D6k/E9nitCe1bFyVTfYSUvVodZpjd/ezLPemcfEeTtzaAKRE9GA2yeu/frAgMBAAECggEAZeUCH12IYphwEaHQeHz9uZ/7+jBCINOV0Erxt8RMdD8/v3K4Vc0OpL5a+d33FFeoiPDS99jJUpMrijURKieEyacppqkSLES/dQA0OJdbgTN7m+Nt7oqUXA2THTyHaZ4MThHX9U/UKzAx3Xgc+CkkkVMArA8h2cfbgA7YBDhVxPMV/Xjm2RKygLR7PWpUbnlUveDienQgr+Gy0IOhqXbMFxfGGjDvsMEjbC0Oxn8DjN/zINAtbXNmcMc0UVyK07af4eziDgUH66aVpDT1dXwPYtbfHwGkOW9bnSwHc0hn/+xg4zDYW3SdfJ2CivTpTjbUQ8aCdbnBK88dKsRLcgI1sQKBgQDQnr49RtykHctsmuqzUrycsrA0C2Oe3lSZiolD1r0rn2KPAEt3kjXi2uOnYtwPcc18b+m6FgwyO4k1M38o8ldwdcXrh0hFmBb9GV+I2Ef8nJ5PD4xC5gQl6WZX0c1PnR70UKxQScmWVIlTmKeUnR2LJ0Ki47OCcNll2wZQJUawCQKBgQCvgSZDOCYQCs0mCji56cDaO5qXBHWf+90qvIlEZN70KRIPyYJgfSiDilClYY4L0/1ovsgz55xZX+mtkDFu5fPJErMUhiGndnEgcAZYdK/mu8lB7moQbsdlR3eHH2F8WmMxveB43uwDtxpRYuEVGOTlsPeEbLGME2M9zLqizBj9UwKBgCW3DR122hyxZj1UJGoW4xJRG5nNFU17VEAN05L4F2rzfZXsr7gGLse8WrvAG5iPMl70vIRvx/Ss3rlHfg2hAj3KjOVvp5ktTbqkA6lxsFHy3ovce7b8bnOMJnxp6XwjI513mC9Lp64NymXaizFK1jR5/IoGMEW8sRDA7/s9QfJBAoGBAIXTMA7voK543geUob65zJFcA7wF7X9JeVLeIrlhRVTegGRDXsQei6cJ8Aa7hanlQwT8/QH/KQxJg5ESM2+BrsvzE1SiFsVwHkECywPmLj79kDBTENNo9Wh3/1+sgRRmg97pD2J7cXI/y7SldkY1Dk1LDOIQU64hFnqIQwRiJuf7AoGAIXT20R5Kz/O+X5W41G2bTF2IbeuYtR2YVBvti1uqoLaVYhiegYoQWUSkkLFk4P6S0qN3D5RrJiAYTXzgvbmP+eyJZphvZhxUM5wg/K40QBad2IPoANSRczWWkb9PABcYHh5CiQrBDSfHodtCtwDZjWOVFM65kV4tr8WMwBHXGhA=";
        
    //    //TODO !!!! 注:该公钥为测试账号公钥  开发者必须设置自己的公钥 ,否则会存在安全隐患
    //    public static final String PUBLIC_KEY        = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjwXDOBfcKi27DElUCZHzBR0pP5ufIoYi1l9yEx/RduqAbyl3NKM3UMBhgiE4Z2C3hoHjaoObHKldtD3BZHohWmgSXdk4BpLRgm4GkqRjMunp/QXkoSIJelPfRZS5289pFy1Fp7Ekia/9LhKDNMuHD84B3rfOhxiQkkuhg6lnWnjg3JWfMcsDFiP+/b/7uqkG7De0MHVe30uqgmY6mgQkdvwsiU845upRZGlzTcUSpcGYqZFH001oohCLu5A+zgKvMVUU+A2T9ADAMgguhgw08jSelVew+pPxPZ4rQntWxclU32ElL1aHWaY3f3syz3pnHxHk7c2gCkRPRgNsnrv36wIDAQAB";
        /**支付宝网关*/
        public static final String ALIPAY_GATEWAY    = "https://openapi.alipaydev.com/gateway.do";
    
        /**授权访问令牌的授权类型*/
        public static final String GRANT_TYPE        = "authorization_code";
    }
    @RestController
    @RequestMapping("/oauth")
    @Api(value="支付宝授权回调")
    public class AliPayOauth2Controller {
    	Logger BAITIAO_USER_LOG = LoggerUtils.Logger(LogFileName.BAITIAO_USER);
    	@RequestMapping(value = "/getAuthCode" )
    	@ResponseBody
    	public String resultCode(HttpServletRequest request, HttpServletResponse response) throws Exception {
    		String code = null;
    		String openid = null;
    		String  state= request.getParameter("state");
    		code = request.getParameter("auth_code");// 用户授权码
    		BAITIAO_USER_LOG.info("自定义参数为==="+state);
    		// 沙箱环境
    		
    		AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do",
    				AlipayServiceEnvConstants2.APP_ID,
    				AlipayServiceEnvConstants2.PRIVATE_KEY, "json", AlipayServiceEnvConstants2.CHARSET, AlipayServiceEnvConstants2.ALIPAY_PUBLIC_KEY, "RSA2");
    		//正式环境
    		/*AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
    				AlipayServiceEnvConstants.APP_ID,
    				AlipayServiceEnvConstants.PRIVATE_KEY, "json", AlipayServiceEnvConstants.CHARSET, AlipayServiceEnvConstants.ALIPAY_PUBLIC_KEY, "RSA2");*/
    		
    		AlipaySystemOauthTokenRequest tokenRequest = new AlipaySystemOauthTokenRequest();
    		tokenRequest.setCode(code);
    		tokenRequest.setGrantType(AlipayServiceEnvConstants.GRANT_TYPE);
    		try {
    		    AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(tokenRequest);
    		    System.out.println(oauthTokenResponse.getAccessToken());
    		    openid = oauthTokenResponse.getUserId();
    		} catch (AlipayApiException e) {
    		    //处理异常
    		    e.printStackTrace();
    		}
             String url=state+"?openId="+openid;
             BAITIAO_USER_LOG.info("openId==="+openid);
             BAITIAO_USER_LOG.info("拼接路径为==="+url);
    		 return "redirect:url";
             //return  openid;
    	}
    	
    }

    上面的配置文件 有注释可以自己看, 下面是controller的写法 可以获取到userId了 

    我写的是openId 

     如果openId和UID 一样就说明成功了

    当然还要引入这些JAR包 

    https://docs.open.alipay.com/54/103419/

    下载jar包到本地引入仓库 

    打开cmd 窗口执行:

    mvn install:install-file -DgroupId=com.alipay.sdk -DartifactId=alipay-sdk-java -Dversion=3.6.0.ALL -Dpackaging=jar -Dfile=F:\java\alipay-sdk-java-3.6.0.ALL.jar

    记得把 F:\java\alipay-sdk-java-3.6.0.ALL.jar 这个地址换成自己的就好了 

    然后引入pom依赖

     <dependency>
    			<groupId>com.alipay.sdk</groupId>
    			<artifactId>alipay-sdk-java</artifactId>
    			<version>3.6.0.ALL</version>
    		</dependency>
    		
    		 <dependency>
    			<groupId>commons-logging</groupId>
    			<artifactId>commons-logging</artifactId>
    			<version>1.1.1</version>
    		</dependency>

    controller 不报错就算可以了

    然后运行, 用授权url 尝试, 就可以了

    如果让登录  请用沙箱账号登录 

    剩下的就看你自己了,或者请教老同事

    展开全文
  • 支付宝缴费标准接入Demo详细步骤
  • 支付宝”电脑网站支付“接口对接

    千次阅读 2017-12-22 16:27:00
    支付宝”电脑网站支付“接口对接

    支付宝”电脑网站支付“接口对接

     

    “电脑网站支付接口”文档地址https://docs.open.alipay.com/270/alipay.trade.page.pay/

     

    第一步:创建应用

    要在您的应用中使用支付宝开放产品的接口能力:

    1.    您需要先去蚂蚁金服开放平台(open.alipay.com),在开发者中心创建登记您的应用,此时您将获得应用唯一标识(APPID);

    2.    请在【功能信息】中点击【添加功能】,选择【电脑网站支付】;

    3.    提交审核,等待审核通过,该应用正式可以使用。

     

    第二步:配置密钥

    开发者调用接口前需要先生成RSA密钥,RSA密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)。详情请参考《配置应用环境》。

    第三步:搭建和配置开发环境

    1.下载服务端SDK

    为了帮助开发者调用开放接口,我们提供了开放平台服务端SDK,包含JAVA、PHP和.NET三个语言版本,封装了签名&验签、HTTP接口请求等基础功能。请先下载对应语言版本的SDK并引入您的开发工程。
    各语言版本服务端SDK详细使用说明,请参考《服务端SDK使用说明

    2.接口调用配置

    在SDK调用前需要进行初始化,代码如下:

    IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", APPID, APP_PRIVATE_KEY, "json""1.0""RSA2", ALIPAY_PUBLIC_KEY, "utf-8"false);

    3、SDK接入

    统一收单下单并支付页面接口alipay.trade.page.pay:

    直接调用支付宝提供的SDK即可生成Form表单

                AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();

                //支付宝服务器主动通知商户服务器里指定的页面http/https路径

    request.SetNotifyUrl(buySend.BgUrl);

                //同步返回地址,HTTP/HTTPS开头字符串

    request.SetReturnUrl(buySend.ShowUrl);

                request.BizContent = "{" +

                    //商户订单号

                "    \"out_trade_no\":\"" + buySend.OrderId + "\"," +

                    //销售产品码,与支付宝签约的产品码名称。 注:目前仅支持FAST_INSTANT_TRADE_PAY

                "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +

                    //订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]

                "    \"total_amount\":" + buySend.OrderAmount + "," +

                    //订单标题

                "    \"subject\":\"" + buySend.ProductName + "\"," +

                    //订单描述

                "    \"body\":\"" + buySend.ProductName + "\"" +

                "  }";

                //开放平台SDK封装了签名实现,只需在创建DefaultAlipayClient对象时,设置请求网关(gateway),应用id(app_id),应用私钥(private_key),编码格式(charset),支付宝公钥(alipay_public_key),签名类型(sign_type)即可,报文请求时会自动进行签名。

                AlipayTradePagePayResponse response = client.pageExecute(request);

                string form = response.Body;

                yd.hbyy.Common.Log.Response(buySend.OrderId, form);

                Response.Write(form);

    异步通知验签:

    获取异步通知参数

    Dictionary<stringstring> sArray = GetRequestPost();

    ……

    调用SDK,将参数传入即可

    bool flag = AlipaySignature.RSACheckV1(sArray, ALIPAY_PUBLIC_KEY, CHARSET, SignType, false);

     

     

    特别注意:

    1IIS站点程序池中的 进程模型-加载用户配置文件 改为true,不然验签会出现异常系统找不到指定的文件

    2、公钥使用的是支付宝公钥,不是应用公钥。配置的应用私钥、应用公钥是支付宝用来验证我们发送的缴费信息,支付宝公钥是我们用来验证支付宝异步通知的信息!!!

    展开全文
  • springboot项目对接支付宝支付

    万次阅读 2018-04-23 16:09:48
    支付宝对接文档一 准备工作1. 首先要到 蚂蚁金服开发者中心 注册商家账户,并认证。2.下载java版的sdk和demo sdk&amp;demo下载地址3.将sdk加入到项目中,在项目根路径下新建libs文件夹,将jar包复制进去,我...

    支付宝对接文档

    一 准备工作

    1.    首先要到 蚂蚁金服开发者中心 注册商家账户,并认证。
    2.
    下载java版的sdkdemo sdk&demo下载地址
    3.
    sdk加入到项目中,在项目根路径下新建libs文件夹,将jar包复制进去,我使用的是maven,用maven打包并上传到公司的jar包管理。

    4.利用RSARSA签名验签工具生成公钥、私钥并保存。生成公钥放到如图应用公钥的位置。详细操作按照官网教程操作,很简单的,这里就不上图片了。

     

    二、开发接口

    1、因为开发环境是使用沙箱环境,上线后会使用真实环境,所以支付宝的一些参数我们放到配置文件里 pay-dev.properties appid和支付宝公钥上面图片中有,直接在网页上复制就好。

      2、支付宝配置可以选择配置类也可以选择配置参数

    #支付宝配置
    #支付同步返回地址
    ali_return_url = 
    #支付异步通知地址
    ali_notify_url = 
    #产品码
    product_no = FAST_INSTANT_TRADE_PAY
    #超时时间
    time_express = 15m
    #支付网关
    url = https://openapi.alipaydev.com/gateway.do
    #商户号
    appid = 2016091500519530
    #私钥
    private_key = 
    #公钥
    ali_public_key = 
    #加密方式
    sign_type = RSA2

    3、开始编写写接口
    这里支付宝要用的一些参数,我是通过@Value自动注入进来的,官方给的demo是,定义个AlipayConfig类,然后全部定义成静态变量,根据个人喜好问题选择,官方的demo中有,可以直接复制,然后修改为你自己的参数即可

    注意:并非配置文件中写全部参数,具体参数设置可以参开官网参数列表

    数据库操作:根据自己的业务需求,我这里是支付提交创建现金表,每次交互要记录支付过程产生的日志信息,我这里还需要创建交易日志表。

    Param:

    public class AlipayParam implements Param {
    
        @ApiModelProperty(value = "金额", required = true)
        @NotNull(message = "金额不能为空}")
        private String amount;
    
        @ApiModelProperty(value = "订单名称", required = true)
        @NotNull(message = "订单名称 不能为空}")
        private String orderName;
    
        @ApiModelProperty(value = "订单号", required = true)
        @NotNull(message = "订单号 不能为空}")
        private String orderId;
    }
    public class AlipayOrderParam implements Param {
    
        private String out_trade_no;//商户订单号
        private String product_code;//销售产品码
        private String total_amount;//总金额
        private String subject;//订单标题
        private String timeout_express;//该笔订单允许的最晚付款时间,逾期将关闭交易
        private String passback_params;//公共校验参数
    }

     

    Controller:

    public class AlipayController {
        @Resource
        private AlipayService alipayService;
    
        //1.申请付款
        @ApiOperation("申请付款")
        @RequestMapping(value = "/order", method = RequestMethod.POST)
        public String alipay(@Valid AlipayParam alipayParam, BindingResult result) {
            return alipayService.alipay(alipayParam);
        }
        //2.a1lipay支持同步返回地址
        @ApiOperation("同步")
        @RequestMapping(value = "/getReturnUrlInfo",method = RequestMethod.GET)
        public String alipayReturnUrlInfo(HttpServletRequest request) {
         return alipayService.synchronous(request);
        }
        //3.alipay异步通知调用地址
        @ApiOperation("异步通知")
        @RequestMapping(value = "/getNotifyUrlInfo",method = RequestMethod.POST)
        public void alipayNotifyUrlInfo(HttpServletRequest request,HttpServletResponse response){
          alipayService.notify(request,response);
        }
    }

    Service:

    /**
     * 付款
     * @param alipayParam 付款参数
     * @return 付款返回值
     */
    String alipay(AlipayParam alipayParam);
    
    /**
     * 付款同步返回地址
     * @param request
     * @return
     */
    
    String synchronous(HttpServletRequest request);
    /**
     * 付款异步通知调用地址
     * @param request 新增参数
     * @return 新增返回值
     */
    void notify(HttpServletRequest request,HttpServletResponse response);

    ServiceImpl:

    public class AlipayServiceImpl implements AlipayService {
    
        @Value("${ali_return_url}")
        private String ali_return_url;
    
        @Value("${ali_notify_url}")
        private String ali_notify_url;
    
        @Value("${product_no}")
        private String product_no;
    
        @Value("${time_express}")
        private String time_express;
    
        @Value("${url}")
        private String url;
    
        @Value("${appid}")
        private String appid;
    
        @Value("${private_key}")
        private String private_key;
    
        @Value("${ali_public_key}")
        private String ali_public_key;
    
        @Value("${sign_type}")
        private String sign_type;
    
        @Resource
        private CashLogMapper cashLogMapper;
    
        @Resource
        private CashMapper cashMapper;
    
        @Resource
        private OrderMapper orderMapper;
        public static final String TRADE_SUCCESS = "TRADE_SUCCESS"; //支付成功标识
        public static final String TRADE_CLOSED = "TRADE_CLOSED";//交易关闭
    
        @Override
        public String alipay(AlipayParam param) {
            //  session 中获取用户
            UserData userData = UserContext.getUserData();
            if (userData == null || userData.getUserId() == null) {
                return WebUtils.buildPage("登录失效, 请重新登录");
            }
            if (!BusinessTypeConstant.USER_CATEGORY_SELLER.equals(userData.getUserCategory())) {
                log.info("卖家用户才可以进行支付");
                return WebUtils.buildPage("卖家用户才可以进行支付");
            }
            // 订单已支付
            Cash cash = cashMapper.getCashByOrderId(param.getOrderId());
            if (cash != null && "3".equals(cash.getStatus())) {
                log.info("订单已支付");
                return WebUtils.buildPage("订单已支付");
            }
            String merchantOrderNo;
            Boolean isRetry = false;
            if (cash != null && new Date(System.currentTimeMillis() - 7800000).before(cash.getCreateTime())) {
                merchantOrderNo = cash.getMerchantOrderNo();
                isRetry = true;
            } else {
                merchantOrderNo = param.getOrderId() + new SimpleDateFormat("HHmmss").format(new Date());
            }
            String urlEncodeOrderNum = "";
            try {
                urlEncodeOrderNum = URLEncoder.encode(merchantOrderNo, "UTF-8");//公告参数订单号
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            //向支付宝发送支付请求
            AlipayClient alipayClient = new DefaultAlipayClient(url, appid
                    , private_key, "json", "UTF-8"
                    , ali_public_key, sign_type);
            //创建Alipay支付请求对象
            AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
            request.setReturnUrl(ali_return_url); //同步通知url
            request.setNotifyUrl(ali_notify_url);//异步通知url
            AlipayOrderParam alipayOrderParam = new AlipayOrderParam();
            alipayOrderParam.setOut_trade_no(merchantOrderNo);//唯一标识
            alipayOrderParam.setProduct_code(product_no);
            alipayOrderParam.setSubject(param.getOrderName());
            alipayOrderParam.setTotal_amount(param.getAmount());
            alipayOrderParam.setTimeout_express(time_express);
            alipayOrderParam.setPassback_params(urlEncodeOrderNum);
            request.setBizContent(JSON.toJSONString(alipayOrderParam));//设置参数
            String webForm = "";//输出页面的表单
            try {
                webForm = alipayClient.pageExecute(request).getBody(); //调用SDK生成表单
            } catch (Exception e) {
                log.info("支付请求发送失败");
                return WebUtils.buildPage("支付请求发送失败,请联系我们客服协助处理");
            }
    
            // 记录下发起付款
            if (isRetry) {
                cashLogMapper.add(merchantOrderNo, "RETRY", JSON.toJSONString(alipayOrderParam), new Date());
            } else {
                cashLogMapper.add(merchantOrderNo, "ADD", JSON.toJSONString(alipayOrderParam), new Date());
            }
            // 创建一条支付状态记录
            cashMapper.add(param.getOrderId(), merchantOrderNo, new Date());
            return webForm;
        }
    
        @Override
        public String synchronous(HttpServletRequest request) {
    
            Map<String, String> parameters = new HashMap<>();
            Map<String, String[]> requestParams = request.getParameterMap();
            log.info("支付宝同步参数", requestParams);
            for (Map.Entry<String, String[]> entry : requestParams.entrySet()) {
                String key = entry.getKey();
                String[] values = entry.getValue();
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
                }
                parameters.put(key, valueStr);
            }
            //记录日志
            String merchantOrderNo = request.getParameter("out_trade_no");//商户订单号
                cashLogMapper.add(request.getParameter("out_trade_no"), "SYNCHRONOUS", JSON.toJSONString(parameters), new Date());
            return "<html>\n" +
                    "<head>\n" +
                    "<script type=\"text/javascript\"> function load() { window.close(); } </script>\n" +
                    "</head>\n" +
                    "<body οnlοad=\"" +
                    "load()\"> </body>\n" +
                    "</html>";
        }
    
        @Override
        public void notify(HttpServletRequest request, HttpServletResponse response) {
            //接收参数进行校验
            Map<String, String> parameters = new HashMap<>();
            Map<String, String[]> requestParams = request.getParameterMap();
            for (Map.Entry<String, String[]> entry : requestParams.entrySet()) {
                String key = entry.getKey();
                String[] values = entry.getValue();
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
                }
                parameters.put(key, valueStr);
            }
            log.info("parameters is [parameters={}]", parameters);
            String appId = request.getParameter("app_id");//appid
            String merchantOrderNo = request.getParameter("out_trade_no");//商户订单号
    
            String orderId = cashMapper.getCashByMerchantOrderNo(merchantOrderNo).getOrderId();
            if (orderId == null) {
                log.error("orderId is null");
                ReturnData.fail(ReturnCode.SERVER_EXCEPTION);
            }
            log.info("orderId: {}", orderId);
            String payState = request.getParameter("trade_status");//交易状态
            String encodeOrderNum = null;
            cashLogMapper.add(request.getParameter("out_trade_no"), "NOTIFY", JSON.toJSONString(parameters), new Date());
            try {
                encodeOrderNum = URLDecoder.decode(request.getParameter("passback_params"), "UTF-8");
                log.info("encodeOrderNum is [encodeOrderNum={}]", encodeOrderNum);
    
                boolean signVerified;
                signVerified = AlipaySignature.rsaCheckV1(parameters, ali_public_key, "UTF-8", sign_type);//验证签名
                log.info("signVerified is [signVerified={}]", signVerified);
                if (signVerified) { //通过验证
                    log.info("payState: {}", payState);
                    if (payState.equals(TRADE_SUCCESS)) {
                        //判断订单号与插入的订单号是否一样
                        if (merchantOrderNo.equals(encodeOrderNum) == false || appid.equals(appId) == false) {
                            log.info("vali failure");
                            cashMapper.update(merchantOrderNo, 4);
    
                            response.getOutputStream().print("failure");
                            return;
                        }
                        cashMapper.update(merchantOrderNo, 3);
                        orderMapper.afterPay(orderId
                        );
                        response.getOutputStream().print("success");
                        return;
                    } else if (payState.equals(TRADE_CLOSED)) { //交易关闭
                        cashMapper.update(merchantOrderNo, 7);
                    } else {
                        cashMapper.update(merchantOrderNo, 4);
                        response.getOutputStream().print("failure");
                        return;
                    }
                } else {
                    //签名校验失败更状态
                    cashMapper.update(merchantOrderNo, 4);
                    response.getOutputStream().print("failure");
                    return;
                }
                log.info("encodeOrderNum is  [encodeOrderNum={}]", encodeOrderNum);
                cashMapper.update(merchantOrderNo, 4);
                response.getOutputStream().print("failure");
                return;
            } catch (AlipayApiException e) {
                log.error(e.getErrMsg());
                throw new RuntimeException("调用支付宝接口发生异常");
            } catch (UnsupportedEncodingException e) {
                log.error(e.getMessage());
                throw new RuntimeException("URLDecoderf发生异常");
            } catch (IOException e) {
                log.error(e.getMessage());
                throw new RuntimeException("IO发生异常");
            }
    
        }
    }

    总结:与支付宝对接,本地生成订单进行提交到支付宝同步处理完支付,支付宝会通过异步来获取用户给支付宝反馈的信息会最终确定是否支付成功,在开发过程中注意支付确认(异步)的逻辑处理即可,具体返回参数可以参开

    4、进行沙箱环境的测试

    访问接口地址 项目地址/alipay/pay 我的是 127.0.0.1/alipay/pay/order

    如果后台没有报错的话,他会自动重定向到,支付宝的付款页面,如下图所示。这时候我们下载安装沙箱版的app,然后使用官方提供的账户扫描然后直接付款,付款成功后会回调后面那两个接口,在通知的那个接口里处理你的业务逻辑。查看沙箱app的登录帐户名和密码.

    总结:砂箱环境每个人都可以开通支付账户并可以查看相应的买家和商家的账号,商家用户需要公司走相关流程大致一周多的时间。

    展开全文
  • 最近需要对接支付宝的支付接口,官方文档写得内容有点分散,整理了一下发布出来,用作记录,同时也希望对不了解情况的人有所帮助,这里以电脑端的网页支付为例。 开发主要分为三个步骤:一、生成私钥公钥。二、建立...

    最近需要对接支付宝的支付接口,官方文档写得内容有点分散,整理了一下发布出来,用作记录,同时也希望对不了解情况的人有所帮助,这里以电脑端的网页支付为例。

    开发主要分为三个步骤:一、生成私钥公钥。二、建立应用。三、沙箱环境。四、接口开发

    一、生成私钥公钥

    生成密钥的官网文档:官网文档

    官方文档讲得已经很详细,按照步骤来即可,记得保存好公钥与私钥,下面需要用到

    二、建立应用

    1.首先进入蚂蚁金服开放平台的首页,通过支付宝账户登录,登录的时候要选择一个身份,这个选自研开发者吧,反正后面可以拓展

    2.在蚂蚁金服的首页的头像旁边进入管理中心,然后点击“开发中心”:

    然后选择网页和移动应用快速接入支付/行业,注意旁边的“研发服务”,接下来我们会用到:

    进入之后选择“支付接入”创建一个用于接入支付的应用:

    然后输入相关的信息后点击确认创建:

    创建成功之后可以看到如下页面:

    可以在功能列表选择自己需要的功能。

    开发设置中可以填入自己需要的信息,其中加密方式建议选择RSA(SHA256)密钥,公钥填写之前生成的公钥。
    注:输入公钥时验证会失败,但是对我们的开发没有影响,暂时可以不管

    填写完之后,提交审核,审核按钮在页面上方= =,审核过程大概一个小时左右吧。实际生产环境的应用需要等待这个审核,但是我们开发可以运用沙箱环境来进行。

    三、沙箱环境

    什么是沙箱环境?
    沙箱环境实际上跟真实的生产环境差不多,开发的时候我们用沙箱进行,测试bug,到了生产环境中,我们只要替换APPID和支付宝网关就可以了,非常方便。

    在网页上端,点击开发平台,进入沙箱:

    在这里需要注意两个地方:

    • 沙箱环境下的支付宝网关
    • 配置好自己的公钥

    沙箱账号

    这个账号用来模拟真实的支付宝账户,毕竟我们开发进行支付时不会使用自己的真实支付宝进行支付。

    后面还有什么沙箱账号以及沙箱工具什么的,就自己看了。
    准备得差不多了,接下来说说怎么开发接口

    四、接口开发

    我用的开发语言是JAVA,工具为IDEA,一个简单的springboot工程
    1.构建一个普通的springboot工程,引入支付宝SDK的maven依赖:

    1

    2

    3

    4

    5

    <dependency>

         <groupId>com.alipay.sdk</groupId>

         <artifactId>alipay-sdk-java</artifactId>

         <version>3.0.0</version>

       </dependency>

    新建一个AlipayConfig类,用于配置支付的相关配置:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    public class AlipayConfig {

     

      // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号,开发时使用沙箱提供的APPID,生产环境改成自己的APPID

      public static String APP_ID = "你的沙箱APPID";

     

      // 商户私钥,您的PKCS8格式RSA2私钥

      public static String APP_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://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";

     

      // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问(其实就是支付成功后返回的页面)

      public static String return_url = "http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";

     

      // 签名方式

      public static String sign_type = "RSA2";

     

      // 字符编码格式

      public static String CHARSET = "utf-8";

     

      // 支付宝网关,这是沙箱的网关

      public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

     

      // 支付宝网关

      public static String log_path = "C:\\";

     

     

    //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

     

      /**

       * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)

       * @param sWord 要写入日志里的文本内容

       */

      public static void logResult(String sWord) {

        FileWriter writer = null;

        try {

          writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");

          writer.write(sWord);

        } catch (Exception e) {

          e.printStackTrace();

        } finally {

          if (writer != null) {

            try {

              writer.close();

            } catch (IOException e) {

              e.printStackTrace();

            }

          }

        }

      }

    3.新建一个controller包,用于存放Action,新建一个PayController类,编写一个用于支付的接口/pay

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    @RestController

    public class PayController {

     

     

      @RequestMapping("/pay")

      public void payController(HttpServletRequest request, HttpServletResponse response) throws IOException {

        //获得初始化的AlipayClient

        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.APP_ID, AlipayConfig.APP_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 = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");

        //付款金额,必填

        String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8");

        //订单名称,必填

        String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8");

        //商品描述,可空

        String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8");

     

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","

            + "\"total_amount\":\""+ total_amount +"\","

            + "\"subject\":\""+ subject +"\","

            + "\"body\":\""+ body +"\","

            + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

     

        //若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明

        //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","

        //      + "\"total_amount\":\""+ total_amount +"\","

        //      + "\"subject\":\""+ subject +"\","

        //      + "\"body\":\""+ body +"\","

        //      + "\"timeout_express\":\"10m\","

        //      + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节

     

        //请求

        String form="";

        try {

          form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单

        } catch (AlipayApiException e) {

          e.printStackTrace();

        }

        response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);

        response.getWriter().write(form);//直接将完整的表单html输出到页面

        response.getWriter().flush();

        response.getWriter().close();

      }

    新建一个JSP页面,用于模拟提交订单
    首先要添加JSP的相关依赖:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    <!-- tomcat 依赖包 -->

        <dependency>

          <groupId>org.springframework.boot</groupId>

          <artifactId>spring-boot-starter-tomcat</artifactId>

        </dependency>

        <dependency>

          <groupId>org.apache.tomcat.embed</groupId>

          <artifactId>tomcat-embed-jasper</artifactId>

        </dependency>

        <!-- servlet 依赖包 -->

        <dependency>

          <groupId>javax.servlet</groupId>

          <artifactId>javax.servlet-api</artifactId>

        </dependency>

    配置文件添加springMvc的映射路径

    1

    2

    spring.mvc.view.prefix=/WEB-INF/jsp/

    spring.mvc.view.suffix=.jsp

    新建一个页面:

    页面所在的目录

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

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

         pageEncoding="UTF-8"%>

     

    <form action="/pay" method="post">

      订单号:<input type="text" name="WIDout_trade_no" required><br/>

      订单名称:<input type="text" name="WIDsubject" required><br/>

      付款金额:<input type="text" name="WIDtotal_amount" required><br/>

      WIDbody:<input type="text" name="WIDbody"><br/>

      <input type="submit" value="下单"> <input type="reset" value="重置">

    </form>

    required保证提交的时候这两项内容非空
    5. controller类添加跳转到jsp页面的映射:

    1

    2

    3

    4

    @RequestMapping("/")

     public String toTest(){

       return "index";

     }

    6.测试运行,启动项目,在浏览器输入:http://localhost:8080/

    输入订单号,订单名称,金额,就可以跳转到支付宝的支付页面了:

    由于这个是沙箱环境,所以这个二维码无法识别,我们选择右边的登录支付宝账户付款

    在这里我们输入的是之前沙箱账号和支付密码,输入之后就可以进入到支付页面,与实际中的操作是一样的:

    这里跳转回去的页面就是之前AlipayConfig类中的return_url 在这之前需要进入notify_url 接口进行验签,这两个接口就不演示了,先知道这回事,实际开发的时候再进行开发。

    到此这篇关于springboot对接支付宝支付接口(详细开发步骤总结)的文章就介绍到这了,更多相关springboot 支付宝支付接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:

    也许是最全java资料!(文档+项目+资料)【点击下载】 和努力的人一起学习Java!

     

    展开全文
  • 半年前的一次战略合作协议的签署,让阿里巴巴集团加入了沈阳智慧城市工程的建设,如今,市民已经可以通过支付宝的“城市服务”享受到方便快捷的各项民生及政务服务。 在阿里巴巴集团与沈阳市政府签署的全面战略合作...
  • 项目中用到了微信扫码,支付宝扫码支付。前端调取支付宝接口(后台进行了封装,没有直接调取支付宝接口)。 调用接口返回数据中,会有一串form表单字符串返回,前端需要做的就是把这串form 表单字符串通过...
  • C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码) 原文:C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码)自动填密码大家可能都不莫生,最有名的应该是 按键精灵 只要是一个...
  • java对接银联

    2021-02-04 09:57:24
    主要对接银联下单,查询订单,关闭订单接口 -------------------------------------------------------测试对接类------------------------------------------------------- @Slf4j public class PayMock { //测试...
  • C#对接银行接口总结

    2021-01-08 14:57:03
    文章目录前言一、对接分析1.微信2.支付宝3.中国建设银行4.中国银行5.信合银行6.中国农业银行7.光大银行总结 前言 在开发工作中,也对接了一些银行,第三方支付接口,今天总结一下。 一、对接分析 微信 支付宝 ...
  • 前端时间,我们收到了一个自来水公司的电子开票系统开发需求,要求能够对接企业原有的收费系统,根据收费数据,自动或手动电子开票。并实现微信公众号缴费、自动开票功能。开票部分需要对接国家的...对接微信生活缴费
  • 微信支付全流程对接文档

    千次阅读 2019-05-07 09:09:58
    微信支付全流程对接文档 第一部分:诊中支付 1.1.1患者信息查询 请求地址 注意 诊疗卡类型必须支持身份证和院内诊疗卡两种(patCardType = 1或5); 当诊疗卡类型为...
  • 系统已加入防掉线处理,只要不断网支付宝不会掉线的。 5、本程序经测试,可在2003、xp和win7正常运行且几乎不占内存,如有软件问题,请联系技术解决 6、目前为免费测试,如要使用请联系购买正版。以资鼓励! 7、注意...
  • springboot支付宝网页支付 沙箱环境测试,测试环境运行ok!
  •  最近项目APP需要接入微信、支付宝支付功能,在分配开发任务时,听说微信支付接口比支付宝支付接口要难实现,由于我开发经验不是那么丰富(现工作经验1年半)且未接触过支付接口开发,组里刚好又有支付接口的老司机...
  • JavaEE 支付宝支付

    2018-04-05 08:24:05
    JavaEE 支付宝支付 开发文档大全 ...支付宝支付使用SDK进行对接API,会比微信好很多,已经封装好了,不同请求对象对应不同响应对象。 1. 支付宝—双对称加密 支付宝与微信的不同之处: 微信是通过x...
  • 对接支付宝官方文档api https://opendocs.alipay.com/apis/api_15/alipay.data.dataservice.bill.downloadurl.query 支付宝官方提供的接口,返回的数据是对账文件的下载地址,根据官网描述,用户需要在获取到下载...
  • 支付宝当面付

    2020-07-03 15:31:42
    目前公司支付平台集成了支付宝app、微信app、支付宝小程序、微信小程序、支付宝H5(扫码-主扫)、微信H5(扫码-主扫)、云闪付、建设钱包付等多种支付方式,今天给大家分享支付宝当面付的支付流程。 二、代码 目前...
  • springboot 支付宝支付

    2021-03-14 12:22:22
    右侧直接支付宝扫码支付就完事了。 登陆之后需要填写入驻信息,如果是个人开发者的话可以切换一下信息,默认为系统服务商,可自行切换到开发者身份。如下图所示。 2. 进入沙箱环境 登陆成功后,如下图所示...
  • 支付宝接入流程

    千次阅读 2017-06-16 13:52:30
    public function pay($out_trade_no, $total_fee, $subject = '缴费', $body = '缴费') { $client = new AopClient; $client->gatewayUrl = $this->gatewayUrl; $client->appId = $this->appId; $client->...
  • 若确认开具的是“增值税电子普通发票”(电子发票),请根据以下不同开票方式查询: 1)通过微信、支付宝扫码开具电子发票,开具成功时微信、支付宝会收到系统提示,若无提示,请联系加油站确认油站工作人员是否操作...
  • 华为 配置 MAC认证优先 Portal认证 Mac无感知快速认证 Radius认证计费 对接 外部 Portal认证计费系统 案例 介绍: OpenPortal网络准入认证计费系统,支持用户名密码认证、短信认证、钉钉授权认证、微信认证、...
  • AD域LDAP对接配置 实现用户名密码实名认证 访客短信认证 二维码扫码 钉钉授权认证 来宾身份证刷卡快速开户 双因子 多因子 融合认证 介绍: OpenPortal网络准入认证计费系统,支持与H3C所有支持Portal认证的AC...
  • H3C配置 Portal认证 mac-trigger快速认证 Mac无感知认证 Radius认证计费 对接 外部Portal认证计费系统 案例 介绍: OpenPortal网络准入认证计费系统,支持用户名密码认证、短信认证、钉钉授权认证、微信认证、...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 297
精华内容 118
关键字:

支付宝生活缴费对接