ヾ(๑╹◡╹)ノ"
写一篇文档记录下自己在支付宝生活号开发上遇到的一些困难。
作为一个第一次接触到支付宝生活号的小萌新,一开始是有点茫然无措的,啥都不懂怎么办呢?
当你是第一次开发生活号时,首先应该去网上了解生活号开发的一些 流程,以及如何去配置生活号。
提供支付宝生活号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 blocke.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
好了 今天就到此结束啦!撒有哪啦ヾ(◍°∇°◍)ノ゙

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

  1. 支付宝生活号开发(php)

    支付宝生活号开发(php) 鉴于支付宝生活号开发的Demo看起来比较乱,自己最近做了这个东西,所以就整理了一下,希望对你有点帮助! 激活开发者模式 class AlipayController ext ...

  2. 支付宝生活号开发配置以及相应的流程

    由于最近公司涉及到支付宝服务号升级生活号,故有机会接触支付宝生活号的开发. 前期准备:申请支付宝生活号 步骤:说实话,支付宝生活号管理后台涉及功能太多,所以找到相应的配置项还是比较绕的 1.登录支付宝 ...

  3. java对接支付宝生活号激活开发模式

    最近需要对接支付宝无感停车,为此需要对接支付宝生活号,而生活号开发除了一系列的添加签约功能后,在对接前需要激活开发模式,因此一堆啃爹内容出现了,下面举例一波激活开发模式有的坑. 按照如图框框依次下载d ...

  4. spring boot中支付宝生活号事件订阅,中文参数乱码问题解决方案

    项目使用的是spring boot 2.0.0 RELEASE版本 出发点: 在支付宝生活号后台设置好支付宝默认应用网关之后,只要有关注.取关等等事件之后都会发推送过来. 看样子默认是GBK编码,得验 ...

  5. 支付宝生活号异步通知地址_异步生活。

    支付宝生活号异步通知地址 Last year I turned off all my notifications. I stopped booking meetings. I started livi ...

  6. python 支付宝生活号激活开发者模式-验签和签

    python 支付宝生活号激活开发者模式-验签签名 不啰嗦,直接开始,首先介绍一下这里使用的环境. 主要环境介绍 1 python3.72 Django3.03 alipay-sdk-python3. ...

  7. 支付宝生活号接入方案

    开通服务号,进入页面https://fuwu.alipay.com/platform/open.htm ,选择"应用所有者",填写好申请并提交: 2. 进入支付宝服务号管理后台,登 ...

  8. 支付宝生活号h5网页--蚂蚁认证

    支付宝生活号h5网页--蚂蚁认证 前言 开发点 1.获取认证url 2.跳转到认证的url地址 3.认证结束 4.查询认证结果 注意点 总结 前言 前段时间生活号要求加功能,需要实现社会保障卡的挂失和 ...

  9. 支付宝生活号服务窗接入问题汇总

    2019独角兽企业重金招聘Python工程师标准>>> 最近因公司业务需求,需要接入支付宝生活号服务窗的事件订阅功能,但接入过程中也是一波三折各种坑.总体感受,接入支付宝不如接入微信 ...

最新文章

  1. MapServer WinForm开发成功
  2. 利用matlab程序分别设计一正弦型信号_ARM Mbed数字信号处理
  3. 叮叮叮~~~~网络面试题(一)来了☺
  4. html css三类选择器,css三类选择器 用法 引用
  5. android 崩溃日志捕获,安卓Java崩溃的捕获和日志记录
  6. Kotlin生态调查结果出炉:超过6成的开发者用过Kotlin了
  7. chrome断点调试其他技巧
  8. html360se,360浏览器发布SE版本
  9. h5游戏引擎有哪些?h5制作模板游戏的教程和流程是什么?
  10. Prolog:list处理(复习笔记)
  11. 离线强化学习(Offline RL)系列3: (算法篇) TD3+BC 算法详解与实现(经验篇)
  12. IOI2021集训队作业
  13. 怎么做微信小程序?做微信小程序的步骤
  14. 用python 判断一个单链表是否有环
  15. 三万字硬核详解:yolov1、yolov2、yolov3、yolov4、yolov5、yolov7
  16. lis25ba_实验LIS25BA骨振动传感器采集音频
  17. 四论设立永中软件的非法性
  18. CSP-S2022T1题解
  19. 连续4个月成为销冠?美团王兴20亿投的汽车成功
  20. 常用近红外光谱预处理方法简介

热门文章

  1. 如何彻底卸载2345全家桶?
  2. 客户旅程分析 Customer Journey Mapping
  3. 挂耳式蓝牙耳机哪家的好用,推荐几款实用的挂耳式耳机
  4. mysql如何使用多核cpu_利用多核 CPU 实现并行计算
  5. RK3288开发板PopMetal上的GPIO驱动实例
  6. python3模拟登录知乎
  7. 网络安全与攻防-常见网络安全攻防
  8. 全角和半角相互转换(C语言实现)
  9. 头像截图上传两种方式(SWFUpload、一个简单易用的flash插件)
  10. 关于鸿蒙开发系统组件的摘抄及运用1