支付宝生活号开发中所遇到的困难及解决记录

ヾ(๑╹◡╹)ノ"
写一篇文档记录下自己在支付宝生活号开发上遇到的一些困难。
作为一个第一次接触到支付宝生活号的小萌新,一开始是有点茫然无措的,啥都不懂怎么办呢?
当你是第一次开发生活号时,首先应该去网上了解生活号开发的一些 流程,以及如何去配置生活号。
提供支付宝生活号Demo的下载地址:https://docs.open.alipay.com/54/104507/
第一步:了解生活号
首先申请生活号。这个因为是其他人申请所以大家可以浏览下其他人的介绍
配置生活号,我们需要关注的几个点如下
在这里插入图片描述
①支付宝网关:这个是标准配置 即https://openapi.alipay.com/gateway.do
②应用网关:用来接收支付宝的异步传递的信息根据自己的需求进行配置
③授权回调地址:用来接收支付宝授权操作的回调地址也根据自己的需求进行配置
④加密方式:支付宝是有RSA2和RSA两种加密方式,官方推荐的是RSA2加密,这个通过支付宝提供的密钥生成工具进行生成下载链接:https://docs.open.alipay.com/291/105971
⑤接口内容加密方式:这个官方已经不推荐使用了,我也就没动过
以上是正常上线生活号的配置,支付宝还推出了一个“沙箱”帮助进行开发基本都和如上一致,除了“支付宝网关”不同,沙箱的网关是:https://openapi.alipaydev.com/gateway.do
基本配置完成之后,就要进行生活号开始的关键一步:“获取支付宝授权”(在这个坑上困了我好久,有时候看官方文档也是模糊不清,后来才慢慢搞懂)
支付宝授权是通过访问支付宝提供的URL得到:如下是官方提供的示例
https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_URL
对其中关键词介绍下
①app_id:支付宝会对每一个应用提供一个APPID,可以在自己的应用里进行查看
②scope:scope是用来判断你需要获取用户什么信息。目前只支持auth_user和auth_base两个值
③redirect_uri:这个和上面配置的"授权回调地址一致"一定要一致不然会报错。
OK 现在访问的URL 也搞定那该怎么测试呢?(恕我愚钝,一开始我看到这些我都不知道怎么测试)
你可以直接在浏览器内输入进行访问,即可看到效果!
通过这个URL我们可以得到的响应参数如下
appid,source,scope,auth_code(主要是这个啦!获取用户的信息就是通过auth_code得到auth_token通过access_token获取userid以及其他的用户信息)
当响应成功后支付宝会访问你设置的回调地址,就会在request域中获取到这些参数。
接下来我们就通过auth_code进行获取auth_token,参考官方文档如下
https://docs.open.alipay.com/api_9/alipay.system.oauth.token
基本可以使用他提供的程序,但有些地方稍作修改我贴上我的代码如下:

			AlipayClient alipayClient = new DefaultAlipayClient(AlipayUtil.ALIPAY_GATEWAY, 
					AlipayUtil.APP_ID, 
					AlipayUtil.PRIVATE_KEY, 
					AlipayUtil.FORMAT,
					AlipayUtil.CHARSET,
					AlipayUtil.ALIPAY_PUBLIC_KEY,
					AlipayUtil.SIGN_TYPE);
			AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
			request.setCode(authCode);
			request.setGrantType(AlipayUtil.GRANT_TYPE);
			try {
			    AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);

调用成功后就可以用方法:oauthTokenResponse.getAccessToken()读取到AccessToken

OK,接下来也是重要的一步 用access_token换取用户的信息,参考的官方文档如下
https://docs.open.alipay.com/api_2/alipay.user.info.share
这个是真的根据文档里的示例代码就ok了之后就可以成功获取用户的一些基本信息如:
在这里插入图片描述
简单介绍下沙箱吧:沙箱是支付宝提供的一个模拟开发的一个容器吧。帮助你开发用的。比如开发到“支付”等功能用线上的应用不好搞定,比较麻烦,沙箱提供你一个用户账户和商户账户让你更轻便的开发。
在这里插入图片描述
哈哈 ,刚看到这个余额的时候还是觉得蛮有意思的。

到此为止生活的授权以及用户信息获取的功能就已经搞定了。之后还会有支付功能等的实现我也会在我之后的开发过程更新到这里那就撒有哪啦~

10.16接着更
在简单接触过支付宝的支付功能后, 我也来此记录下,其实到目前为止,我觉得最困扰我的不是写代码而是去找支付宝对应的接口,因为第一次接触的缘故,网上的资料也有限,很难准确地找到需要的接口,也是一点点尝试才慢慢了解。哎,而且走了好多错路(;´д`)ゞ
OK第一个介绍的是网页上调用支付宝支付的接口(alipay.trade.page.pay)官方文档在下面↓
https://docs.open.alipay.com/270/alipay.trade.page.pay/
必填的请求参数不多只有4个因为作为测试使用我填写的也就这几个
①Out_trade_no:商品的唯一订单号
②Product_code:销售产品码,目前唯一的值只有FAST_INSTANT_TRADE_PAY
③Total_amount:商品总价
④Subject:订单标题
具体执行的代码大家可以直接参考官方文档里的Java代码。
页面支付代码
唯一需要注意的地方就是下面这几句代码
在这里插入图片描述
只有写了这几句才能弹出支付宝支付的界面不然就是白茫茫的网页。
然后简单看下效果
这个是如果你在网页里登录了支付宝账号的效果↓
页面支付效果
这个是你没有在网页登陆过支付宝的效果↓
扫码的方式
但是如果你的生活号没有该权限的话就会出现下面这个页面
没有权限的支付界面

然后接下来介绍下手机端调用支付宝支付的方式的其中之一接口是:alipay.trade.wap.pay(手机网站支付接口2.0)
https://docs.open.alipay.com/api_1/alipay.trade.wap.pay
↑↑↑官方文档在此
参数也是如下几个
①Subject:商品的标题
②Out_trade_no:商品的单号
③Total_amount:总价
④Seller_id:卖家的userid
⑤Quit_url: 用户付款中途退出返回商户网站的地址
⑥Product_code:销售产品码目前只有QUICK_WAP_WAY
调用接口的方法官方文档也是很详细了我也就不贴了只是提醒下官方文档少了几句代码可能会影响效果,补充上就可以了

httpResponse.setContentType("text/html;charset=" + CHARSET);
    httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
    httpResponse.getWriter().flush();
httpResponse.getWriter().close();

出现的效果界面如下 ↓
手机支付端

我相信大家在操作一段时间之后也就慢慢了解了支付宝接口的相似之处也会更好更快地去掌握其他接口
退款接口:alipay.trade.refund(统一收单交易退款接口) 官方文档↓↓
https://docs.open.alipay.com/api_1/alipay.trade.refund
这个就比较简单啦!必选的请求参数也比较少只有2个
①Out_trade_no/trade_no:交易的订单号,官方文档中介绍只要其一即可
②Refund_amount:退款金额不能大于花费金额
今天就更新到这啦。如果有什么不懂的,我看到也会尽可能地回复大家!不过我也还只是一枚萌新ヾ(◍°∇°◍)ノ゙

10.23日咱们继续。
在不断熟悉支付宝支付接口的时候,我发现了一个之前被我所忽略的参数“notify_url”(文档解释为支付宝异步通知路径)。那在此我就简单地讲下notify_url和另外一个return_url之间的差别。部分截取自网上各位大神的见解。
在支付宝中通知有两种方式:return_url、nitify_url
①return_url:支付宝以GET的方法访问,作为页面跳转的路径
②notify_url:支付宝以POST的方法进行访问,作为可靠的处理业务逻辑的路径(必须要可以被外网所访问的路径,所以localhost是不可以的哦)
notify_url为服务器通知,支付宝可以保证99.9999%的通知到达率,前提是您的网络通畅。
return_url为网页重定向通知,是由客户的浏览器触发的一个通知,若客户去网银支付,也会受银行接口影响,由于各种影响因素特别多,所以该种类型的通知支付宝不保证其到达率。
买家付款成功后,会跳到 return_url所在的页面,这个页面可以展示给客户看,这个页面只有付款成功才会跳转,并且只跳转一次。
附上一份支付宝支付的流程图:
在这里插入图片描述
相信看到这里,大家对notify_url的作用已经支付的流程有了大致的了解,但可能不清楚怎么去使用(因为我就是这样)那我在下面附上一部分的代码作为大家的参考。也会帮助大家对notify_url有更好的理解。
https://docs.open.alipay.com/203/105285/
参考的官方文档↑↑

AlipayClient alipayClient = AlipayUtil.getAlipayClient();
			AlipayTradeWapPayRequest req = new AlipayTradeWapPayRequest();
			String out_trade_no = orderNo;	
			String typeName = "充电";
			double totalAmount = Double.parseDouble(money);
			req.setReturnUrl(AlipayUtil.RETURN_URL);
			req.setNotifyUrl(AlipayUtil.CHARGE_NOTIFY_URL);//外网能够访问到的路径
			req.setBizContent("{" +
					"\"body\":\"" + "body" + "\"," +
					"\"subject\":\"" + typeName +"\"," +
					"\"out_trade_no\":\"" + out_trade_no + "\"," +
					"\"total_amount\":" + "0.01" + "," +
					"\"seller_id\":\"" + AlipayUtil.ALIPAY_SELLERID + "\"," +
					"\"quit_url\":\"用户退出付款的跳转页面\"," +
					"\"product_code\":\"QUICK_WAP_WAY\"" +
					"  }");
			try {
				AlipayTradeWapPayResponse resp = alipayClient.pageExecute(req);
				String form = resp.getBody();
				response.setContentType("text/html;charset=utf-8");
				response.getWriter().write(form);//直接将完整的表单html输出到页面
				response.getWriter().flush();
				response.getWriter().close();
				if(resp.isSuccess()) {
					logger.info("app调用成功");
				}else {
					logger.info("app调用失败");
				}

这样用户在执行支付功能后会跳转到AlipayUtil.CHARGE_NOTIFY_URL。如我设置的是 ALIPAY_URL + “/port/alinotify.action”;
这样到了该路径下创建一个action

@RequestMapping(value="alinotify" ,method=RequestMethod.POST)
	public void notifyMethod(HttpServletRequest request,HttpServletResponse response) throws IOException {
		logger.info("===================支付宝支付返回11======================");
		PrintWriter out = response.getWriter();
		Map<String,Object> result = null;
		try {
			Map<String,String> params = new HashMap<String,String>();
			Map requestParams = request.getParameterMap();
			//logger.info("===================支付宝支付返回数据22:"+JacksonUtils.toJsonStringByObject(requestParams));
			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] + ",";
				}
				//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
				params.put(name, valueStr);
			}
			//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
			//商户订单号
			String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");			
			//支付宝交易号
			String trade_no =  new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
			//交易状态
			String trade_status =  new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
			logger.info("===================支付宝支付返回33out_trade_no:"+out_trade_no);
			logger.info("===================支付宝支付返回33trade_no:"+trade_no );
			logger.info("===================支付宝支付返回33trade_status:"+trade_status );
			logger.info("验证是否通过:" + AlipayNotify.verify(params));
			if(AlipayNotify.verify(params)){//验证成功
				//请在这里加上商户的业务逻辑程序代码
				logger.info("===================支付宝支付验证成功!");
				//OrderModel form = new OrderModel();
				//form.setOrdernum(out_trade_no);
				//form.setTransactionNo(trade_no);
				**out.println("success");**	//请不要修改或删除:这个很重要,验证通过一定要给支付宝回一个success不然支付宝会不断地访问

这只截取了部分,如果出现有些包缺失的话可以在下载的支付宝Demo里进行导入即可。其中
**AlipayNotify.verify(params)**是主要的验证方式。AlipayNotify这个可以在Demo里进行下载
点开这个类后有些部分是需要修改的

private static boolean getRSASignVerify(Map<String, String> Params, String sign) {
    	//过滤空值、sign与sign_type参数
    	Map<String, String> sParaNew = AlipayCore.paraFilter(Params);
        //获取待签名字符串
        String preSignStr = AlipayCore.createLinkString(sParaNew);
        //获得签名验证结果
        boolean isSign = false;
        try {
			isSign = AlipaySignature.rsa256CheckContent(//如果是RSA验证的话这里是调用AlipaySignature.rsaCheckContent
																						//方法,不然会报错。Demo里默认的是RSA验证,此为RSA2的验证
					preSignStr, sign, AlipayUtil.ALIPAY_PUBLIC_KEY,//不要使用支付宝默认的值,根据自己的实际进行设置
					AlipayUtil.CHARSET);
		} catch (AlipayApiException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        return isSign;
    }
    private static String verifyResponse(String notify_id) {
        //获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求

        String partner = AlipayUtil.PARTNER;//这里PARTNER也一定要设置成自己的哦,默认的也不是	
        String veryfy_url = HTTPS_VERIFY_URL + "partner=" + partner + "&notify_id=" + notify_id;

        return checkUrl(veryfy_url);
    }

根据以上的设置应该就ok了,当你执行支付功能的时候就可以看到效果
2018-10-23 11:21:40 INFO PortController:562 - =支付宝支付返回11====
2018-10-23 11:21:40 INFO PortController:588 - ===================支付宝支付返回33out_trade_no:20181023111739-31410
2018-10-23 11:21:40 INFO PortController:589 - ===================支付宝支付返回33trade_no:2018102322001476501005756954
2018-10-23 11:21:40 INFO PortController:590 - ===================支付宝支付返回33trade_status:TRADE_SUCCESS
notify_id :2018102300222111754076501017467166
responseTxt :true
好了 今天就到此结束啦!撒有哪啦ヾ(◍°∇°◍)ノ゙

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
开发交易网站时,可能会遇到以下问题: 1. 安全问题:交易网站涉及到用户的个人信息和资金交易,安全问题必须得到保障。解决办法可以是采用加密技术、使用安全协议和证书、设置防火墙等措施来保护用户信息和交易安全。 2. 支付问题:交易网站需要提供安全、可靠、方便的支付方式,如银行转账、支付宝、微信支付等。开发者需要了解各种支付方式的接入流程、手续费、安全性等方面的问题,保证支付流程的顺畅和安全。 3. 流程设计问题:交易网站的交易流程需要设计得合理有效,用户可以快速、简单地完成交易。在设计过程中需要考虑用户体验和易用性,避免冗长的步骤和繁琐的操作,提高用户的满意度。 4. 网站性能问题:交易网站需要处理大量的用户请求和数据交换,需要具有高性能和可扩展性。开发者需要优化系统架构、数据库设计和网络通信等方面,保证网站的高效运行。 5. 法律合规问题:交易网站需要遵守相关的法律法规,如电子商务法、网络安全法等。开发者需要了解相关规定并合理设计网站的功能和流程,保证交易的合法性和合规性。 针对这些问题,开发者可以采取以下解决办法: 1. 采用安全技术和措施,如 SSL/TLS 加密、安全协议、防火墙等,保障用户信息和交易安全。 2. 接入多种支付方式,了解各种支付方式的接入流程、手续费、安全性等方面的问题,保证支付流程的顺畅和安全。 3. 优化网站的交易流程设计,提高用户体验和易用性,避免冗长的步骤和繁琐的操作,提高用户的满意度。 4. 优化系统架构、数据库设计和网络通信等方面,保证网站的高效运行和可扩展性。 5. 遵守相关法律法规,合理设计网站的功能和流程,保证交易的合法性和合规性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值