精华内容
下载资源
问答
  • 支付宝支付对接

    千次阅读 2020-03-28 15:49:47
    支付宝支付对接1. 开放平台及应用信息创建2. 秘钥配置3. 回调配置 写在前面,这篇文章主要是作者在对接支付宝APP支付时,将需要用到的相关信息进行整理而来,支付宝官方文档链接如下:支付宝开放平台官方文档. 1. ...


    写在前面,这篇文章主要是作者在对接支付宝APP支付时,将需要用到的相关信息进行整理而来,支付宝官方文档链接如下: 支付宝开放平台官方文档.

    1. 开放平台及应用信息创建

    首先,在进行支付宝APP支付对接之前,需要入驻支付宝开放平台
    登陆支付宝开放平台之后,进入开发者中心,如下图:
    在这里插入图片描述在这里插入图片描述
    进入开发者中心之后,按照个人需求创建你的应用信息,支付宝应用的功能有些需要签约才能使用,有些只针对企业账户,个人开发者不能只用。

    2. 密钥配置

    在创建好相关信息之后,需要利用密钥生成工具生成RSA加密的公钥和私钥,应用公钥上传到支付宝平台,私钥自己保存好,然后按照支付宝的官方信息文档进行对接,其实支付宝开放平台的官方文档和示例已经非常清楚,大家直接看平台的文档就可以了,这里作者就不在做过多的叙述了。支付宝APP支付快速接入官方文档,这里在放一张官方问的系统交互流程图:在这里插入图片描述

    3. 回调配置

    回调的配置是需要根据自身业务结合去做一些处理,在开放平台的应用上配置好回调地址,具体可以根据官方文档看情况处理。这里需要提及的一点就是当验证正确并正确处理的时候,必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是 success 这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h)。作者的回调函数实现如下:

     /**
         * 支付宝回调函数
         *
         * @param request
         * @return
         * @throws AlipayApiException
         */
        @PostMapping(value = "/pay/alipayNotify")
        public String alipayNotify(HttpServletRequest request) throws AlipayApiException {
            logger.info("############### Alipay Notify ######################");
            Map<String, String> map = new HashMap<String, String>();
            Map<String, String[]> requestParams = request.getParameterMap();
            for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
                String name = iter.next();
                String[] values = requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
                }
                map.put(name, valueStr);
            }
            logger.info("#######查看信息:  "+map.toString());
            boolean signVerified = false;
            try {
                signVerified = AlipaySignature.rsaCheckV1(map, AlipayProperties.getPublicKey(), AlipayProperties.getCharset(), AlipayProperties.getSignType());
            } catch (AlipayApiException e) {
                e.printStackTrace();
                return ("fail");// 验签发生异常,则直接返回失败
            }
            if (signVerified) {
                //处理你的业务逻辑,更新订单状态等
                logger.info("验证成功");
                if (map.get("trade_status").equals("TRADE_SUCCESS")) {
                   //成功时处理业务逻辑
                }
    
                /**
                 *  程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是 success 这7个字符,
                 *  支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知
                 *  (通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);
                 */
                return ("success");
            } else {
                logger.info("验证失败,不去更新状态");
                return ("fail");
            }
    
        }
    
    展开全文
  • 本资源采用了PHP语言开发,CI框架,实现了微信和支付宝支付对接,其中微信支付包含两种支付方式;1.微信中访问链接直接支付,2.浏览器中(PC或H5)访问链接,产生支付二维码使用微信扫码支付。支付宝也包含两种支付...
  • 支付宝对接文档

    2018-07-14 18:18:32
    支付宝对接文档 里面包括支付宝Demo下载地址 及支付宝官方文档地址,RAS2加密工具下载地址
  • 支付宝对接 官方示例

    2016-09-14 15:44:15
    支付宝对接 官方示例
  • 支付对接时序图

    2018-10-03 12:54:21
    支付对接时序图,官方最新接口文档的时序图,支付对接时序图,官方最新接口文档的时序图,
  • 支付宝对接 网上银行对接

    热门讨论 2011-10-12 18:57:18
    jsp支付宝对接案例 网上银行对接案例,例子有gbk跟uft两种编码格式的例子,希望能帮助到大家
  • 支付宝刷脸支付对接自己的程序

    万次阅读 2019-04-05 21:45:34
    今天公司让实现支付宝刷脸支付对接自己的程序实现刷脸,在网上看了一些博客发现大部分都有点乱,现在我来总结一下自己的实现方法,整个文章分为四个部分:流程分析、客户端实现、服务端实现、实现程序所必须的数据。...

    今天公司让实现支付宝刷脸支付对接自己的程序实现刷脸,在网上看了一些博客发现大部分都有点乱,现在我来总结一下自己的实现方法,整个文章分为四个部分:流程分析、客户端实现、服务端实现、实现程序所必须的数据。

    当然,在看该文章时最好先浏览一下官方文档,结合理解,同时下载相应的sdk等。
    这个官方文档流程说的比较清晰↓
    https://docs.alipay.com/pre-open/20180402104715814204/quickstart
    这个官方文档的代码比较清晰↓
    https://docs.alipay.com/pre-open/20171214172813219030/qs8myr

    一:流程分析

    首先我们先来看一下官方的时序图,明确一下接入流程。
    分析时序图一方面是为了能够弄清楚整个接入的运行流程,另一方面则是为了明确什么是我们应该做的,什么是支付宝以及给我们实现好的。
    在这里插入图片描述
    从时序图上看,我们需要重点关注的只有从商户APP和商户服务端发出和接收的箭头
    也就是说橙色块的是需要我们自己实现的。蓝色色块的全部都是支付宝已经实现的部分。
    从我的实践上来讲,刷脸SDK和刷脸APP我们也需要在意一下。
    当然我们并不需要了解这两个部分是怎么实现的,但是我们需要注意下我们的要开发的程序与这两个部分的关系。

    展开全文
  • 支付宝对接实例

    2013-12-11 17:11:37
    支付宝对接例子代码 Maven构建的项目 项目源码
  • 支付宝对接web端demo

    2019-04-27 16:00:29
    这个资源为对接支付宝的开发接口,支付宝对接web端的一个demo
  • 2020最新易支付支付对接源码 可对接anlei等项目 源码无脑搭建 自行搭建即可 教程里面已经写好了
  • GlobalPayment支付对接HPP方式官方sdk。官方文档请查看:https://developer.globalpay.com/ecommerce/hosted-payment-page#hpp
  • 支付宝支付对接DEMO

    千次阅读 2019-04-21 20:12:59
    对接支付宝流程: 以post方式进行提交参数请求到支付宝接口进行支付 支付宝收到支付后进行通知给你安全、支付回调等问题(两种通知方式:1.同步通知,2.异步通知) ❶同步通知 支付宝同步通知本地浏览器进行重定向...

    对接支付宝流程:
    一、步骤分析
    ❶以post方式进行提交参数请求到支付宝接口进行支付
    ❷支付宝收到支付后进行通知给你安全、支付回调等问题(两种通知方式:1.同步通知,2.异步通知)
    ①同步通知
    支付宝同步通知本地浏览器进行重定向操作,主要给用户展示支付宝支付结果是否成功,不会处理订单状态
    ②异步通知
    支付宝服务器使用httpclient技术调用你的接口进行通知,支付宝把支付结果以报文方式给你,你进行解析是支付成功还是失败,根据结果修改订单状态,可能由于网络原因,你没有响应支付宝,这时候支付宝可能会进行补偿机制,解决支付回调幂等使用全局ID

    二、图解DEMO配置步骤

    公钥加密,私钥解密

    1. 将下载的alipay.trade.page.pay-JAVA-UTF-8项目导入到eclipse中,可以通过如下链接下载
      链接:https://pan.baidu.com/s/1g-uOZ_HJ3qj2QiWe3-qmqw
      提取码:f3er

    2. 通过如下链接进入支付宝沙箱登录页面
      https://openhome.alipay.com/platform/appDaily.htm
      在这里插入图片描述

    3. 进入到如下界面
      在这里插入图片描述

    4. 使用支付宝生成公钥应用代码生成公钥和私钥,可通过如下链接下载
      链接:https://pan.baidu.com/s/1DCCxrzFGll_A7jg3OceVMg
      提取码:ezft

    5. 生成公钥和私钥之后,复制公钥配置到如下处
      在这里插入图片描述

    6. 将生成的私钥粘贴到项目中的如下处
      在这里插入图片描述

    7. 在步骤5中的图片中查看支付宝公钥并复制
      在这里插入图片描述

    8. 将复制的支付宝公钥粘贴到项目中的如下处
      在这里插入图片描述

    9. 复制APPID,并粘贴
      在这里插入图片描述
      在这里插入图片描述

    10. 复制支付宝网关,并粘贴
      在这里插入图片描述
      在这里插入图片描述

    11. 配置下面的两个参数要使用外网映射工具(如natapp)
      在natapp中可以购买一个隧道,然后将下载的客户端启动获取复制它的地址并粘贴
      在这里插入图片描述
      其它参数选择默认

    12. 将该项目添加到tomcat中,如下配置
      在这里插入图片描述

    13. 在浏览器中进行访问
      在这里插入图片描述

    14. 进入测试账号
      在这里插入图片描述

    15. 使用测试账号进行测试付款
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      三、将DEMO整合到项目中

    16. 创建表

    CREATE TABLE `payment_info` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `userid` int(11) DEFAULT NULL,
      `typeid` int(2) DEFAULT NULL,
      `orderid` varchar(50) DEFAULT NULL,
      `price` decimal(10,0) DEFAULT NULL,
      `source` varchar(10) DEFAULT NULL,
      `state` int(2) DEFAULT NULL,
      `created` datetime DEFAULT NULL,
      `updated` datetime DEFAULT NULL,
      `platformorderid` varchar(100) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB;
    
    1. 支付流程
    1.向请求支付支付表创建一条支付信息
    2.生成支付token,存入redis,key为支付token,value为支付表id
    3.返回支付token给客户端
    4.使用支付token,向redis查找对应支付表的id
    5.使用支付表的id,获取支付信息
    6.封装支付宝from表单提交参数 
    
    1. 进行项目整合

    创建自己的实体类这块省略不写
    在Payapi接口的服务PayService类中创建接口

        //创建支付令牌
    	@RequestMapping("/createPayToken")
    	public ResponseBase createToken(@RequestBody PaymentInfo paymentInfo);
    	
    	// 使用支付令牌查找支付信息
    	@RequestMapping("/findPayToken")
    	public ResponseBase findPayToken (@RequestParam("payToken") String  payToken);
    

    创建DAO层

        @Select("select * from payment_info where  id=#{id}")
    	public PaymentInfo getPaymentInfo(@Param("id") Long id);
    
    	@Insert("insert into payment_info ( id,userid,typeid,orderid,platformorderid,price,source,state,created,updated) value(null,#{userId},#{typeId},#{orderId},#{platformorderId},#{price},#{source},#{state},#{created},#{updated})")
    	@Options(useGeneratedKeys = true, keyProperty = "id") 
    	public Integer savePaymentType(PaymentInfo paymentInfo);
    
    	@Select("select * from payment_info where  orderId=#{orderId}")
    	public PaymentInfo getByOrderIdPayInfo(@Param("orderId") String orderId);
    
    	@Update("update payment_info set state =#{state},payMessage=#{payMessage},platformorderId=#{platformorderId},updated=#{updated} where orderId=#{orderId} ")
    	public void updatePayInfo(PaymentInfo paymentInfo);
    

    将上面指的DEMO中的AlipayConfig类复制到实现类的项目中
    引入如下jar

            <dependency>
    			<groupId>com.github.1991wangliang</groupId>
    			<artifactId>alipay-sdk</artifactId>
    			<version>1.0.0</version>
    		</dependency>
    

    书写实现类

        @Autowired
    	private PaymentInfoDao paymentInfoDao;
    
    	/**
    	 * 创建支付令牌
    	 */
    	@RequestMapping(value = "/createPayToken", method = RequestMethod.POST)
    	public ResponseBase createToken(@RequestBody PaymentInfo paymentInfo) {
    		// 1.创建支付请求信息
    		Integer savePaymentType = paymentInfoDao.savePaymentType(paymentInfo);
    		if (savePaymentType <= 0) {
    			return setResultError("创建支付订单支付失败");
    		}
    		// 2.生成对应的token
    		String payToken = TokenUtils.getMemberToken();
    		// 3.存放在redis中,key为token,value为支付id
    		baseRedisService.setString(payToken, paymentInfo.getId() + "", Constants.PAY_TOKEN_MEMBER_TIME);
    		// 4.返回token
    		JSONObject data = new JSONObject();
    		data.put("payToken", payToken);
    		return setResultSuccess(data);
    	}
    
    	/**
    	 * 使用支付令牌查找支付信息
    	 */
    	@RequestMapping(value="/findPayToken")
    	public ResponseBase findPayToken(String payToken) {
    		// 1.参数验证
    		if (StringUtils.isEmpty(payToken)) {
    			return setResultError("token不能为空");
    		}
    		// 2.判断token有效期
    		// 3.使用token查找redis,找到对应支付id
    		String payId = (String) baseRedisService.getString(payToken);
    		if (StringUtils.isEmpty(payId)) {
    			return setResultError("支付请求已经超时");
    		}
    		// 4.使用支付id,进行下单
    		Long payID = Long.parseLong(payId);
    		// 5.使用支付id查询支付信息
    		PaymentInfo paymentInfo = paymentInfoDao.getByOrderIdPayInfo(payId);
    		if (paymentInfo == null) {
    			return setResultError("未找到支付信息");
    		}
    		// 6.对接支付代码,返回提交支付from表单元素给客户端
    		// 获得初始化的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 = paymentInfo.getOrderId();
    		// 付款金额,必填
    		String total_amount = paymentInfo.getPrice() + "";
    		// 订单名称,必填
    		String subject = "vm商城充值";
    		// 商品描述,可空
    		// 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 + "\"," + "\"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 result;
    		try {
    			result = alipayClient.pageExecute(alipayRequest).getBody();
    			JSONObject data = new JSONObject();
    			data.put("payHtml", result);
    			return setResultSuccess(data);
    		} catch (AlipayApiException e) {
    			return setResultError("支付异常");
    		}
    	}
    

    上面代码中生成token类和封装的响应类以及redis类就不展示了
    使用postman进行测试,首先测试创建支付令牌方法
    在这里插入图片描述
    测试使用支付令牌查找支付信息方法
    在这里插入图片描述
    19. 整合到web层
    将实现类引入到web层服务的pom中
    写PayServiceFegin接口

    @Component
    @FeignClient("pay")
    public interface PayServiceFegin extends PayService {
    }
    

    在web层服务中写Controller类

        @Autowired
    	private PayServiceFegin payServiceFegin;
    	
    	/**
    	 * 使用token进行支付
    	 * @throws IOException 
    	 */
    	@RequestMapping("/aliPay")
    	public void aliPay(String payToken,HttpServletResponse response) throws IOException{
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter writer = response.getWriter();
    		//1.参数验证
    		if (StringUtils.isEmpty(payToken)) {
    			return;
    		}
    		//2.调用支付服务接口,获取支付宝html元素
    		ResponseBase payTokenResult = payServiceFegin.findPayToken(payToken);
    		if (!payTokenResult.getCode().equals(Constants.HTTP_RES_CODE_200)) {
    			String msg = payTokenResult.getMsg();
    			writer.println(msg);
    			return;
    		}
    		//3.返回可以执行的html元素给客户端
    		LinkedHashMap data = (LinkedHashMap)payTokenResult.getData();
    		String payHtml = (String)data.get("payHtml");
    		log.info("###PayControllerpayHtml{}",payHtml);
    		//4.页面上进行渲染
    		writer.println(payHtml);
    		writer.close();
    	}
    

    在浏览器中进行测试,要传入token参数,如下界面
    在这里插入图片描述
    20. 同步和异步回调
    同步回调
    在Payapi接口的服务CallBackService类中创建接口

        // 同步通知
    	@RequestMapping("/synCallBack")
    	public ResponseBase synCallBack(@RequestParam Map<String, String> params);
    
    	// 异步通知
    	@RequestMapping("/asynCallBack")
    	public String asynCallBack(@RequestParam Map<String, String> params);
    

    在实现payapi的服务中写实现类

        /**
         * 同步回调
         */
        @Override
    	public ResponseBase synCallBack(Map<String, String> params) {
    		//1.日志记录
    		log.info("#####支付宝同步通知synCallBack#####开始,params:{}", params);
    		//2.验签操作
    		try {
    			//调用SDK验证签名
    			boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); 
    			log.info("#####支付宝同步通知signVerified:{}######", signVerified);
    			//——请在这里编写您的程序(以下代码仅作参考)——
    			if(!signVerified) {
    				return setResultError("验签失败");
    			}
    			//商户订单号
    			String outTradeNo = params.get("out_trade_no");
    			//支付宝交易号
    			String tradeNo = params.get("trade_no");
    			//付款金额
    			String totalAmount = params.get("total_amount");
    			JSONObject data = new JSONObject();
    			data.put("outTradeNo", outTradeNo);
    			data.put("tradeNo", tradeNo);
    			data.put("totalAmount", totalAmount);
    			return setResultSuccess(data);
    		} catch (Exception e) {
    			log.error("####支付宝同步通知出现异常,ERROR:", e);
    			return setResultError("系统错误");
    		}finally {
    			log.info("#####支付宝同步通知synCallBack#####结束,params:{}", params);
    		}
    
       /**
    	 * 异步回调
    	 */
    	@Override
    	public String asynCallBack(@RequestParam Map<String, String> params) {
    		// 1.日志记录
    		log.info("#####支付宝异步通知synCallBack#####开始,params:{}", params);
    		// 2.验签操作
    		try {
    			// 调用SDK验证签名
    			boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key,
    					AlipayConfig.charset, AlipayConfig.sign_type);
    			log.info("#####支付宝异步通知signVerified:{}######", signVerified);
    			// ——请在这里编写您的程序(以下代码仅作参考)——
    			if (!signVerified) {
    				return Constants.PAY_FAIL;
    			}
    			// 商户订单号
    			String outTradeNo = params.get("out_trade_no");
    			PaymentInfo paymentInfo = paymentInfoDao.getByOrderIdPayInfo(outTradeNo);
    			if (paymentInfo == null) {
    				return Constants.PAY_FAIL;
    			}
    			// 支付宝重试机制
    			Integer state = paymentInfo.getState();
    			if (state == 1) {
    				return Constants.PAY_SUCCESS;
    			}
    			// 支付宝交易号
    			String tradeNo = params.get("trade_no");
    			// 付款金额
    			// String totalAmount = params.get("total_amount");
    			// 判断实际付款金额与商品金额是否一致
    			// 修改支付宝状态
    			paymentInfo.setState(1);
    			paymentInfo.setPayMessage(params.toString());
    			paymentInfo.setPlatformorderId(tradeNo);
    			// 手动begin
    			Integer updateResult = paymentInfoDao.updatePayInfo(paymentInfo);
    			if (updateResult <= 0) {
    				return Constants.PAY_FAIL;
    			}
    			// 调用订单接口通知,支付状态
    			ResponseBase orderResult = orderServiceFegin.updateOrderIdInfo(1l, tradeNo, outTradeNo);
    			if (!orderResult.getCode().equals(Constants.HTTP_RES_CODE_200)) {
    				// 回滚rollback
    				return Constants.PAY_FAIL;
    			}
    			// 2PC 3PC TCC MQ
    			// 手动 提交 comiit;
    			return Constants.PAY_SUCCESS;
    		} catch (Exception e) {
    			log.error("####支付宝异步通知出现异常,ERROR:", e);
    			// 回滚 手动回滚 rollback
    			return Constants.PAY_FAIL;
    		} finally {
    			log.info("#####支付宝异步通知synCallBack#####结束,params:{}", params);
    		}
    	}
    

    在web层的服务中写Controller

        @Autowired
    	private PayCallBackFegin payCallBackFegin;
    	// 错误页面
    	private static final String ERROR = "";
    	//成功返回的页面,这块用的是templates模板
    	private static final String PAY_SUCCESS = "pay_success";
    
       /**
    	 * 使用token进行支付
    	 * 
    	 * @throws IOException
    	 */
    	@RequestMapping("/aliPay")
    	public void aliPay(String payToken, HttpServletResponse response) throws IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter writer = response.getWriter();
    		// 1.参数验证
    		if (StringUtils.isEmpty(payToken)) {
    			return;
    		}
    		// 2.调用支付服务接口,获取支付宝html元素
    		ResponseBase payTokenResult = payServiceFegin.findPayToken(payToken);
    		if (!payTokenResult.getCode().equals(Constants.HTTP_RES_CODE_200)) {
    			String msg = payTokenResult.getMsg();
    			writer.println(msg);
    			return;
    		}
    		// 3.返回可以执行的html元素给客户端
    		LinkedHashMap data = (LinkedHashMap) payTokenResult.getData();
    		String payHtml = (String) data.get("payHtml");
    		log.info("###PayControllerpayHtml{}", payHtml);
    		// 4.页面上进行渲染
    		writer.println(payHtml);
    		writer.close();
    	}	
    
    	/**
    	 * 同步回调
    	 * @param request
    	 * @param response
    	 * @throws IOException
    	 */
    	@RequestMapping("/callBack/synCallBack")
    	public void synCallBack(HttpServletRequest request, HttpServletResponse response) throws IOException {
    		Map<String, String[]> requestParams = request.getParameterMap();
    		Map<String, String> params = new HashMap<String, String>();
    		for (Iterator<String> 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);
    		}
    		PrintWriter writer = response.getWriter();
    
    		ResponseBase synCallBack = payCallBackFegin.synCallBack(params);
    		if (!synCallBack.getCode().equals(Constants.HTTP_RES_CODE_200)) {
    			return;
    		}
    		LinkedHashMap data = (LinkedHashMap) synCallBack.getData();
    		String htmlFrom = "<form name='punchout_form'"
    				+ " method='post' action='http://127.0.0.1/callBack/synSuccessPage'>"
    				+ "<input type='hidden' name='outTradeNo' value='" + data.get("out_trade_no") + "'>"
    				+ "<input type='hidden' name='tradeNo' value='" + data.get("trade_no") + "'>"
    				+ "<input type='hidden' name='totalAmount' value='" + data.get("total_amount") + "'>"
    				+ "<input type='submit' value='立即支付' style='display:none'>"
    				+ "</form><script>document.forms[0].submit();" + "</script>";
    		writer.println(htmlFrom);
    		writer.close();
    	}
    
    	/**
    	 * 同步回调,解决隐藏参数
    	 * 
    	 * @param request
    	 * @param outTradeNo
    	 * @param tradeNo
    	 * @param totalAmount
    	 * @return
    	 */
    	@RequestMapping(value = "/callBack/synSuccessPage", method = RequestMethod.POST)
    	public String synSuccessPage(HttpServletRequest request, String outTradeNo, String tradeNo, String totalAmount) {
    		request.setAttribute("outTradeNo", outTradeNo);
    		request.setAttribute("tradeNo", tradeNo);
    		request.setAttribute("totalAmount", totalAmount);
    		return PAY_SUCCESS;
    	}
    

    在实现payapi的服务中复制的支付宝的AlipayConfig类改变如下两个参数

        // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    	public static String notify_url = "http://rtwtfv.natappfree.cc/callBack/asynCallBack";
    
    	// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    	public static String return_url = "http://rtwtfv.natappfree.cc/callBack/synCallBack";
    
    

    成功页面的templates模板

    <h3>您的订单号为 ${outTradeNo} ,支付宝F易号${tradeNo} ,支付成功了一笔${totalAmount}元。</h3>
    

    用postman测试
    在这里插入图片描述
    复制上面的token,在浏览器中进行测试
    http:127.0.0.1/aliPay?payToken=TOKEN_MEMBER-b2439a51-ad44-49b0-81cb-086ee8e51bc3
    用测试用户支付成功后会跳转到templates的成功模板中

    页面的回调还有写完,欢迎关注,会持续补全

    待更新。。。

    展开全文
  • 服务端支付宝App支付对接笔记

    万次阅读 2017-01-23 16:03:06
    支付宝在2016年12月份开始将以前的App支付改为...对于现在的App支付对接,其实参照支付宝开发文档App支付请求参数说明就可以进行对接了,但对于新手对接时,还是可能会遇到一些问题.总结一下 一.首先需要清楚公共参数和

    支付宝在2016年12月份开始将以前的App支付改为移动支付,而现在的App支付则是全新的支付,而功能和以前的App支付并没有太大的差别,但申请现在的App支付需要先废除掉以前的移动支付(控制台显示的还是App支付),然后再重新申请.

    对于现在的App支付对接,其实参照支付宝开发文档App支付请求参数说明就可以进行对接了,但对于新手对接时,还是可能会遇到一些问题.总结一下
    一.首先需要清楚公共参数和业务参数中标为必填的参数都必须要有,并提供给客户端.另外,自己的参数不要与支付宝给定的参数重名.
    二.主要参数的获取:

    1. app_id 创建应用,地址管理中心,就会生成对应的应用信息
      这里写图片描述
    2. method 接口名称,这个可在App支付产品介绍 中根据自己的需求填写APP支付产品包含的接口和描述 或者翻看Api字典
    3. charset 请求使用的编码格式,一般都是使用utf-8
    4. sign_type 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
    5. timestamp 发送请求的时间,格式”yyyy-MM-dd HH:mm:ss”
    6. version 调用的接口版本,固定为:1.0
    7. notify_url 支付宝服务器主动通知商户服务器里指定的页面http/https路径。建议商户使用https
    8. biz_content 业务请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递
    9. subject 商品的标题/交易标题/订单标题/订单关键字等.业务参数,拼接时放在biz_content中
    10. out_trade_no 商户网站唯一订单号,这个需要注意支付宝在调用支付的时候会在支付宝的后台生成一个支付订单,而我们调用支付的时候也需要生成我们自己的支付订单,这里的支付订单是我们自己生成的订单号,不要跟回参的trade_no(支付宝后台生成的订单号)搞混.业务参数,拼接时放在biz_content中
    11. total_amount 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000] ,注意这里有好多说要必须格式化为.00的格式,其实不用,只要在取值范围内的整数和小数都可以.业务参数,拼接时放在biz_content中.业务参数,拼接时放在biz_content中*
    12. product_code 销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY.业务参数,拼接时放在biz_content中
    13. sign 商户请求参数的签名串,这个可参考签名 有两种方式,第一种是直接使用支付宝提供的SDK,这个比较简单,支付宝SDK已经对签名和验签做了处理,我们只需要按照参数请求,填入对应的值就行了.第二种是自行实现签名,而使用这种签名方式就有比较多的坑,在这里先讲一下签名需要注意的事项,后面的对接方式也是使用第二种签名方式实现的.根据文档上的说明”请求参数按照key=value&key=value方式拼接的未签名原始字符串”,如下所示:
    app_id=2015052600090779&biz_content={"timeout_express":"30m","seller_id":"","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2&timestamp=2016-08-25 20:26:31&version=1.0

    这个文档已经做了详细的说明,但不太好找自行实现签名,公共的参数需要作为一级的key和value,而业务参数则拼接在biz_content,作为它的value,并且需要注意需要剔除值为空的参数,并按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,再调用加签方法 生成签名.生成签名后,可通过自行实现签名中的”工具演示签名过程”验证自己代码实现的签名的正确性

    三 .拼接请求参数
    在上面的参数介绍中,已经介绍了加签方法.现在需要把签名也作为一对键值,经过ASCII编码组合后拼接到请求串中,这样就能得到类似如下的请求串

    app_id=2015052600090779&biz_content={"timeout_express":"30m","seller_id":"","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2&timestamp=2016-08-25 20:26:31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj+y48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp/M45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g=

    四.拼接请求参数
    最后对请求字符串的所有一级value(biz_content作为一个value)进行encode,编码格式按请求串中的charset为准,没传charset按UTF-8处理,获得最终的请求字符串:

    app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%22%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA2&timestamp=2016-08-25%2020%3A26%3A31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj%2By48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp%2FM45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g%3D

    注意,在使用UTF-8编码的时候可能会遇到空格被转为”+”的情况,这时需要将含有”+”的字符串替换为”%20”
    字符串替换

    完成这些处理后,我们就可以将请求参数发送给客户端,让他们调用对应的支付接口了.

    五.支付回调
    当支付完成以后,支付宝会调用我们的回调接口,在回调接口中,我们可以处理我们的业务逻辑.在回调中,我们首先需要验签:

    验签方法,根据接口不同,验签时会去掉sign_type(rsaCheckV1)或者保留,sign_type(rsaCheckV2)。

    /**    此方法会去掉sign_type做验签,暂时除生活号(原服务窗)激活开发者模式外都使用V1。
    @param params 参数列表(包括待验签参数和签名值sign) key-参数名称 value-参数值
    @param publicKey 验签公钥
    @param charset 验签字符集
    **/
    boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
    
    /**    此方法不会去掉sign_type验签,用于生活号(原服务窗)激活开发者模式
    @param params 参数列表(包括待验签参数和签名值sign) key-参数名称 value-参数值
    @param publicKey 验签公钥
    @param charset 验签字符集
    **/
    boolean AlipaySignature.rsaCheckV2(Map<String, String> params, String publicKey, String charset, String sign_type)

    验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure.主要需要验证的有
    1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
    2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
    3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);
    4、验证app_id是否为该商户本身。上述1、2、3、4有任何一个验证不通过,则表明同步校验结果是无效的,只有全部验证通过后,才可以认定买家付款成功。

    当这些都通过后,就可进行自己的业务逻辑编写了.

    另外,在支付对接中还有很多需要注意的事项,这些都在开发文档中有说明,这里做一下汇总:
    1. 商户在请求参数中,自己附属的一些额外参数,不要和支付宝系统中约定的key(下表中 公共请求参数\请求参数)重名,否则将可能导致未知的异常。
    比如以下示例中app_id=2014072300007148******&version=1.0&biz_content的key是公共请求参数,业务方自己的扩展参数需要放在biz_content内部,比如示例中tips属性,很显然下面total_amount属性是商户按照自己的业务属性赋值的,但是由于total_amount也是支付宝关键key,支付宝将会认为这个total_amount是支付宝业务的参数应该是金额,这个最终将导致误解析。下列请求串为了展示清晰,未进行encode并且做了格式化处理,下同。

    app_id=2014072300007148&charset=UTF-8&version=1.0&timestamp=2016-07-01 08:08:08&method=alipay.trade.app.pay&notify_url=https://api.**.com/pay_receive_notify.html&sign_type=RSA2&sign=ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE&version=1.0&biz_content=
      {
        "body":"对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。",
        "subject":"大乐透",
        "out_trade_no":"70501111111S001111119",
        "timeout_express":"90m",
        "total_amount":"一共花费了10元",
        "seller_id":"2088102147948060",
        "auth_token":"appopenBb64d181d0146481ab6a762c00714cC27",
        "product_code":"QUICK_MSECURITY_PAY",
        "tips":"测试一笔支付"
      }
    1. 商户的请求参数中,所有的key(支付宝关键key或者商户自己的key),其对应的value中都不应该出现支付宝关键key,否则该类交易将可能被支付宝拦截禁止支付。
      比如以下的请求中\”subject\”:\”大乐透 这个辣条不错 out_trade_no=123 total_fee=123.5\”,其value值中有支付宝关键key\”out_trade_no\”、\”total_fee\”,这样的业务请求参数支付宝将会拦截。
    app_id=2014072300007148&charset=UTF-8&version=1.0&timestamp=2016-07-01 08:08:08&method=alipay.trade.app.pay&notify_url=https://api.**.com/pay_receive_notify.htm&sign_type=RSA2&sign=ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE&version=1.0&biz_content=
      {
        "body":"对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。",
        "subject":"大乐透 这个辣条不错 out_trade_no=123 total_fee=123.5",
        "out_trade_no":"70501111111S001111119",
        "timeout_express":"90m",
        "total_amount":10.0,
        "seller_id":"2088102147948060",
        "auth_token":"appopenBb64d181d0146481ab6a762c00714cC27",
        "product_code":"QUICK_MSECURITY_PAY"
      }
    1. 商户支付请求参数的安全注意点:
      a)请求参数的sign字段请务必在服务端完成签名生成(不要在客户端本地签名);
      b)支付请求中的订单金额total_amount,请务必依赖服务端,不要轻信客户端上行的数据(客户端本地上行数据在用户手机环境中无法确保一定安全)。
    2. AlipayClient的实现类都是线程安全的,所以没有必要每次API请求都新建一个AlipayClient实现类;
    3. 创建AlipayClient实现类的实例时,指定format=json,相比xml格式,可以减少数据传输量,提升API请求效率。
    展开全文
  • 支付宝支付接口
  • 支付宝对接相关工具与电脑网站接入demo,包含电脑网站demo,服务端sdk,开发平台助手
  • pay-spring-boot-starter 是一个基于spring-boot实现自动化配置的支付对接, 让你真正做到一行代码实现支付聚合, 让你可以不用理解支付怎么对接,只需要专注你的业务 特性 1. 项目第三方依赖极少,依托于spring ...
  • 支付宝支付对接在线文档:https://opendocs.alipay.com/open/204/01dcc0
  • 微信支付对接文档及案例.zip
  • php 电脑和手机网站支付宝对接示例,首先要签约 再申请产品 通过后方可集成到自己的环境里 联系
  • 最新免签约到账接口 支付宝免签约即时到账接口 扫码支付对接易支付文件
  • 对接支付宝支付接口,支付宝官方文档写的非常清楚,而且还提供了免费的沙箱环境给我们,在真正做支付宝对接之前熟悉整个的一个支付流程,有很多朋友应该也是像我一样第一次对接,不知道从何下手,本文记录我在对接时...
  • 支付宝支付对接文档,代码可直接运行测试
  • 第三方支付对接

    千次阅读 2018-11-28 17:13:30
    第三方支付对接第一步:准备所需的对接文档第二步:获取订单信息第三步:根据接口文档填写数据第四步:回调 第一步:准备所需的对接文档 向第三方平台索取支付文档,商户号及密匙. 第二步:获取订单信息 获取系统生成的订单...
  • 微信公众号JSAPI支付对接

    千次阅读 2017-11-14 17:18:31
    微信公众号JSAPI支付对接事宜 公众号授权 公众号授权 UML 图 流程图 公众号支付 开发步骤 业务流程 API列表 统一下单 微信内H5调起支付 查询订单 代码微信公众号JSAPI支付对接事宜相信各位程序员在开发过程中...
  • JAVA支付——支付宝支付对接

    万次阅读 2019-03-12 10:02:36
    [蚂蚁金服对接平台](https://open.alipay.com/platform/manageHome.htm) 首先登陆蚂蚁金服官方对接平台,这里用沙箱测试 按照官方提示,设置以下配置。 开发部分 依赖包pom &lt;!-- ...
  • 全能第三方支付对接Java开发工具包.优雅的轻量级支付模块集成支付对接支付整合(微信,支付宝,银联,友店,富友,跨境支付paypal,payoneer(P卡派安盈)易极付)app,扫码,网页支付刷卡付条码付刷脸付转账服务商模式、支持...
  • 支付宝刷脸支付对接流程

    万次阅读 热门讨论 2018-11-20 10:03:53
    因为现在的支付基本都使用支付宝微信了,刷脸也应用的越来越多,所以需要写一个对接支付宝刷脸支付的接口 支付宝刷脸主要提供了两种不同的接口,一个是生活类的刷脸接口,一个是支付类的刷脸接口 生活类的刷脸接口...
  • 招行支付对接说明

    千次阅读 2017-03-02 10:11:25
    招行支付和正常的微信支付对接流程是一样的,只是调整了一些参数,比如appid改成了传递sub_appid、openid改成了传递sub_openid。所以请大家在对接时,一定要先阅读文档中的参数要求。 文档地址:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,050
精华内容 11,220
关键字:

支付对接