对接第三方支付接口-支付宝方式对接(我这边对接的是ecpay公司支付接口)

欢迎加群:854228077。
帮助更多java程序员提升技术!资料多,大佬多!

提供信息:
首先商家支付宝收款账号要提供
接口方给接口文档
使用环境:
1.支付宝APP扫码进入H5 web端,购买商品,下单支付。
2.其他购物APP,如KFC官方APP扫码进入H5 web端,购买商品,下单支付。
对接大致流程:
1.调用第三方提供的接口getPaymentUrl(每家公司定义不同)
这个接口的作用是,我这边把基础参数以json格式,传递给ecpay那边的这个接口中,他们会处理这个json参数,向支付宝方发起请求,并且获取到一个form表单,直接返回给我这边。
2.我这边直接把这个form表单转发到前端,前端用JS方法拉起收银台(这里的收银台就是支付宝官方的输入密码界面,术语称为收银台)
3.选择付款方式,是花呗,余额,银行卡等,输入密码。
4.支付宝官方会回调支付成功的响应界面,第三方支付接口会回调我这边的支付结果告知接口,告知我们支付结果。最后,把支付结果返回给我们提供给他们的结果响应页面。
整个支付对接流程,就是这样,是不是很简单。

在这里,我这边条件限制,没有网络环境,所以,我只能按照第三方的接口,及这个交互流程,用支付宝沙箱环境模拟开发。
也就是模拟第三方的getPaymentUrl接口,调用支付宝沙箱支付接口,获取form表单,然后,把返回结果返回给前端页面,实现拉起收银台的动作。

收银台被拉起了,支付就不是问题了。

所以,这个块对接工作的难点就是在如何模拟拉起收银台。

上代码:

第一步:前端点击立即付款,调用我们自己后端的接口。

/**
 * 注意,因为涉及到商业隐私,这里算是伪代码,我只贴了关于接口对接的主要代码。
 */
public Object PayRoadDemo(HttpServletRequest request,PayParams params) throws Exception {
		String jsonParam="";
		if("ALIPAY".equals(payWay)) {//获取支付宝支付方式的json参数。
			portalType="F2FWAP";
			jsonParam=getJsonParams();//生成第三方需要的json数据方法。
		}
		logger.info(jsonParam);
		//调用自己模拟编写的getPaymentURL接口,获取沙箱返回的form表单数据。
		HttpResponse response=HttpRequest.post("http://127.0.0.1/Alipay/Pay/getPaymentURL.do")
                .header("Content-Type","application/json")
                .body(jsonParam)
                .execute();
		//从body中读取返回结果数据。
		BufferedReader tBufferedReader = new BufferedReader(new InputStreamReader(response.bodyStream()));
        StringBuffer checkoutUrl = new StringBuffer();
        String sTempOneLine = new String("");
        while ((sTempOneLine = tBufferedReader.readLine()) != null){
        	checkoutUrl.append(sTempOneLine);
        }
        logger.info(checkoutUrl);
		return checkoutUrl;//返回拉起收银台的url给前端。
	}

第二步:调用getPaymentURL接口,获取form表单,拉起收银台。

/**
 * 注意,因为涉及到商业隐私,这里算是伪代码,我只贴了关于接口对接的主要代码。
 * 这个接口的编写,需要引入支付宝的SDK
 * 	<dependency>
 *	    <groupId>com.alipay.sdk</groupId>
 *	    <artifactId>alipay-sdk-java</artifactId>
 *	    <version>3.3.4.ALL</version>
 *	</dependency>
 */
 public  Object getPaymentURL(HttpServletRequest request,HttpServletResponse response) throws IOException {
		String jsonParam="";
		String str = "";
		//从调用方发起的http请求,获取json参数。
		BufferedReader br;
		br = request.getReader();
		while((str = br.readLine()) != null){
				jsonParam += str;
		}
		logger.info("jsonParam:"+jsonParam);
		//把json参数转成map格式,读取内容。	
		JSONObject  jsonData = JSONObject.parseObject(jsonParam);
		Map<String,Object> dataMap = (Map<String,Object>)jsonData;
		
		JSONObject  paymentOrder = JSONObject.parseObject(dataMap.get("paymentOrder").toString());
		Map<String,Object> paymentOrderMap = (Map<String,Object>)paymentOrder;
		//支付宝接口需要的参数。
		String out_trade_no=new String(paymentOrderMap.get("orderId").toString().getBytes("ISO-8859-1"),
		"UTF-8");//商户订单号
		String subject=new String(paymentOrderMap.get("orderId").toString().getBytes("ISO-8859-1"),
		"UTF-8");//订单名称
		String total_amount=new String(paymentOrderMap.get("orderFee").toString().
		getBytes("ISO-8859-1"),"UTF-8");//付款金额 
		String body=new String("无".getBytes("ISO-8859-1"),"UTF-8");//商品描述
		String timeout_express=new String("3m".toString().getBytes("ISO-8859-1"),"UTF-8");//超时时间 可空
		String product_code=new String("QUICK_WAP_WAY".toString().getBytes("ISO-8859-1"),
		"UTF-8");// 销售产品码 必填
		
		//调用RSA签名方式,下面这段代码来自支付宝官方demo。
	    AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, 
	    	 	AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, 
	    	 	AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);
	    AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();
	    
	    // 封装请求支付信息
	    AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
	    model.setOutTradeNo(out_trade_no);
	    model.setSubject(subject);
	    model.setTotalAmount(total_amount);
	    model.setBody(body);
	    model.setTimeoutExpress(timeout_express);
	    model.setProductCode(product_code);
	    alipay_request.setBizModel(model);
	    // 设置异步通知地址
	    alipay_request.setNotifyUrl(AlipayConfig.notify_url);
	    // 设置同步地址
	    alipay_request.setReturnUrl(AlipayConfig.return_url);   
	    
	    // form表单生产
	    String form = "";
		try {
			// 调用SDK生成表单
			form = client.pageExecute(alipay_request).getBody();
			//这个字符编码格式,必须要设置,否则前端跳转时候会报**签名错误**,亲自掉坑。
			response.setContentType("text/html;charset=" + AlipayConfig.CHARSET); 
		} catch (AlipayApiException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		return form;
    }

第三步:前端获取返回结果的JS代码,拉起收银台。

$.ajax({
		 	type: "post",
		 	url:'${path}/Pay/PayRoadDemo.do',
		 	data:{
		 		Ip:'127.0.0.1',
		 		payWay:'ALIPAY',
		 		orderFee:'50',
		 		mobile:'13344445555',
		 		orderId:'1111111111'
		 	},
   			dataType:"json",
   			success:function(url){
   				console.log(url);
   				//下面四行代码是主要代码。
   				const div = document.createElement('div');
                div.innerHTML = url;//此处form就是后台返回接收到的数据
                document.body.appendChild(div);
                document.forms[1].submit();//这里注意下forms[1],更具自己的情况来。
				
			}
		 });

附文:官方demo下载地址。(这里具体如何使用官方网站的教程,就不细说了)
先登录:https://openhome.alipay.com/platform/manageHome.htm
在进入:在这里插入图片描述
demo下载地址:https://docs.open.alipay.com/54/

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值