我是靠谱客的博主 含糊蜻蜓,最近开发中收集的这篇文章主要介绍支付宝统一收单接口实现支付宝支付,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如果你看到了这篇文章,大概率的说明你已经跪在蚂蚁金服的开发文档了。蚂蚁金服的开发文档实在让人分分钟吐血,这里一堆接口那里一堆接口,同一个参数这里一个名那里一个名。初次接触必跪,我也是醉在了他们的接口上好多天,最后求助技术人工客服才得以解决问题。

切入正题。这里简单的实现一下调用统一收单创建接口实现支付宝付款的例子,整体流程是在支付宝打开调用页面后点击下单,商户后台调用统一收单创建接口,调用成功返回结果给下单页面,下单页面根据tradeNo的值执行jJSAPI吊起支付宝钱包然后付款,付款成功后商户后台的异步通知地址收到支付结果通知,流程结束。

关键参数不会遗漏,非关键参数大家自己根据需求添加吧。

准备

首先要确保相关的一些所需信息准确  有 appid、公钥、私钥以及你生成私钥的算法是RSA还是RSA2,一定要确认清楚这些信息的准确性,不然在调用接口时一定会报错的

先写调下单用的jsp页面,这里面就包含了调用支付宝钱包的JSAPI

pay.jsp 

先放一个按钮用来调用

<input type="button" value="下单" οnclick="payOrder()">

  
 function payOrder (){
	 //调起下单接口,记得先引入jquery
	 $.post("AliPayOrderServer",{},function(data){
		 var json=eval("("+data+")").alipay_trade_create_response;
		 var trade_no=json.trade_no;
		 
		 $(document).ready(function(){
		        tradePay(trade_no); 
		        $("#payButton").click(function() {
		           tradePay(trade_no);
		        });
		        $("#closeButton").click(function() {
		           AlipayJSBridge.call('closeWebview');
		        });
		     });
		    function ready(callback) {
		         if (window.AlipayJSBridge) {
		             callback && callback();
		         } else {
		             document.addEventListener('AlipayJSBridgeReady', callback, false);
		         }
		    }
		    function tradePay(tradeNO) {
		        ready(function(){
		             AlipayJSBridge.call("tradePay", {
		                  tradeNO: trade_no
		             }, function (data) {
		                 if ("9000" == data.resultCode) {
		                     alert("支付成功");
		                 }
		             });
		        });
		    }
		 
		 
		 
		 }
	 );
	 
 }
这样调用统一收单创建接口的页面就写好了

之后我们获取一下买家的user_id(统一收单创建接口蚂蚁金服的接口文档上有一个参数buyer_id(16位)与buyer_long_id不能同时为空,我之前获取到的user_id为32位我就想当然的提交了buyer_long_id,然后被坑了好长时间,问了技术客服才知道,这个参数必须提交16位的buyer_id,也就是接下来我们要获取的user_id)

这里简单获取一下用于后面的下单,各位根据自己具体情况再对数据进行处理就好

我们先去蚂蚁金服获下载一下java开发所需的sdk,之后是发起获取code的请求

public class AliPayCodeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

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

		doPost(request, response);
	}

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

		System.out.println("code执行");
		response.setContentType("text/html");
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		String redirect_uri=URLEncoder.encode("http://xxx.xxxxxxxxx.xxx/xxxx/AliPayUserIdServlet", "UTF-8");//这里是你获取code使用的回调地址
		StringBuffer url=new StringBuffer("https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?redirect_uri="+redirect_uri+
				"&app_id="+你的app_id+"&scope=auth_base&state=123456");
		response.sendRedirect(url.toString());
		out.flush();
		out.close();
	}

}

然后写获取code并通过code获取user_id的回调地址的接口  AliPayUserIdServlet  (请确定已经下载官方提供的java使用的sdk)

public class AliPayUserIdServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

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

		System.out.println("回调成功");
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");
		request.setCharacterEncoding("UTF-8");
		String auth_code="";
		 auth_code=request.getParameter("auth_code");
		 AlipayClient client= alipayClient();
		    AlipaySystemOauthTokenRequest req = new AlipaySystemOauthTokenRequest();
		    req.setCode(auth_code);
		    req.setGrantType("authorization_code");
		    String userId="";
		    
		    try {
		    	 AlipaySystemOauthTokenResponse asotr=client.execute(req);
		    	 userId+= asotr.getUserId();//注意这里请用getUserID的方法获得,AlipaySystemOauthTokenResponse 还有个方法getAlipayUserId获得到的就是32位的user_id
			} catch (Exception e) {
				e.printStackTrace();
			}
		    System.out.println(userId);
	}

	private DefaultAlipayClient alipayClient(){
		DefaultAlipayClient alipayclient=new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","你的appid",   "你的公钥","json", "GBK",
				 "你的私钥","你私钥的加密方式");
		return alipayclient;
	}
}


这样我们在支付宝里打开一下链接 http://xx.xxxxxx.xxx/xxxxx/AliPayCodeServlet,如果参数没错我们就能在控制台看到2088开头的 16位的user_id了,记录一下后面用(大家根据需求自己根据情况处理即可)

接下来就是负责下单的server了,新建一个servelet    AliPayOrderServer

public class AliPayOrderServer extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

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

		response.setContentType("text/html");
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		try {
			
			AlipayTradeCreateResponse resp=AliPayOrder.makeOrder(AliPayOrder.getTestPayRequest());
			if(resp.isSuccess()){
				System.out.println("下单成功");
				out.write(resp.getBody());
			}else{
				System.out.println("下单失败");//如果下单失败阿里的sdk会自己打印错误日志到控制台
			}
		} catch (AlipayApiException e) {
			e.printStackTrace();
		}
		out.flush();
		out.close();
	}

}
然后是我们下单用的工具类 AliPayOrder

public class AliPayOrder {

	public static AlipayTradeCreateResponse makeOrder(AlipayTradeCreateRequest req) throws AlipayApiException{
		AlipayTradeCreateResponse  resp=null;
		AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","你的appid","你的公钥","json","GBK","你的私钥","你的加密方式");
		resp =alipayClient.execute(req);
		return  resp;
	}
	
	public static AlipayTradeCreateRequest getTestPayRequest(){
		AlipayTradeCreateRequest  req=new AlipayTradeCreateRequest ();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
		String notify_url="http://xxx.xxxxxxxx.xxx/xxxxx/NotifyUrlServer";
		req.setNotifyUrl(notify_url);
		JSONObject json=new JSONObject();
		json.put("out_trade_no", "999"+sdf.format(new Date()));
		json.put("total_amount", 0.01);
		json.put("subject", "THESUBJECT");
		json.put("buyer_id", "我们之前获取到的user_id");
        String jsonStr=json.toString();
		req.setBizContent(jsonStr);
		return req;
	}
}
最后一个使我们异步通知地址NotifyUrlServer,支付宝会在订单支付完成后将支付结果发送到这个地址,我们获取一下并返回"success"给支付宝即可,不然支付宝会不断发送结果,直到24小时以后
public class NotifyUrlServer extends HttpServlet {

	private static final long serialVersionUID = 1L;

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

		doPost(request, response);
	}

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

		response.setContentType("text/html");
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		System.out.println("通知结果");
		out.print("success");//将success返回给支付宝
		out.flush();
		out.close();
	}

}

到这里我们就已经可以简单实现支付宝的统一收单创建接口来下单了,接下试验一下:

1.把alipaycodeservlet的请求地址在支付宝里发给一个好友(我只知道这一种在支付宝打开链接的办法,好蠢。。。。。。)然后点击,之后到我们的服务器控制台chaka输出信息



获取到user_id后我们把它填到alipayorder中的json对象中的buyer_id里

2.用同样的方式打开我们最开始的下单jsp页面点击下单

3.服务器控制台打印"通知结果"说明异步通知成功。

这样整个简单下单支付流程就完成了

注意问题:

1.请一定确认openid,公钥,私钥,加密类型的正确性,加密类型只有RSA与RSA2两种,否则new DefaultAlipayClient这个构造方法中信息不对,后面的什么都白费。

2.请一定看清你要调用的接口所对应的sdk中的类名是否都对应正确,好多接口的名字长得非常相似,很长一串可能里面只有一点点的小区别,用混了就跑不下去了。

3.参数类型以及必须与非必须参数,因为最开始只是想简单的打通一下这个单下支付,所以不必要的参数能省则省,所以在填参数的时候,不是必填的我都没有写,然后就跪了有好多参数虽然是不必填,但是可能与其他的不必填参数是必须选一个的,这么重要的问题他们就在后面简单一标,随后我就被提示了N久的参数错误。

4.out_trade_no这个参数必须保证对应我们的支付宝商户是唯一的,也就是说这个参数每次提交必须是不同的,大家可以自己设计一个确保不会重复的生成方式。

最后交给大家一个神技,当你们实在是没有办法的时候,可以去祭出官方的技术客服,他们总是能一针见血的解决问题,而且服务态度都很好,但是联系到他们的办法很操蛋,首先我们在蚂蚁金服平台上找到在线咨询,这个时候会出现一个叫小蚂哥的东西,这个东西有多坑呢,他会给你一堆无所谓的提示,让你点链接,说点了就可以联系人工,我点了以后直接返回了主页,呵呵。后来又听人说输入转人工就可以,我又对着小蚂哥输入点人工,他回复我请输入几个关键字他们帮我看看我需要什么人工,好嘛,我输了个接口,他又给我了之前的链接让我点,我点了之后又去了主页了呵呵。(人工客服正确打开方式是:打开小蚂哥,然后随便输入个字符,不停地输入,过一会聊天窗口会天出个提示按钮,点击可转接人工客服,然后跟他们说需要转技术客服,然后就能祭出技术客服了)。

最后

以上就是含糊蜻蜓为你收集整理的支付宝统一收单接口实现支付宝支付的全部内容,希望文章能够帮你解决支付宝统一收单接口实现支付宝支付所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部