支付宝扫码支付时长控制|支付宝二维码交易时长设定 支付宝多种支付途径 新老接口绕晕官方小二 有事找技术支持避免走弯路 接支付经验

支付宝扫码支付的实现方式真心的多,来来来,看看你有没有印象。
alipay.mobile.public.qrcode.create(生成带参数的二维码) alipay.trade.page.payalipay.mobile.qrcode.manage
以上是收集到的支付宝扫码实现接口,还有当面付接口,这里就再列表了。总之接口变得更加产品化(折磨人)。一不小心就会掉到坑里。从技术的角度来讲,基础接口都是一样的,支付宝人为增加了产品facade接口,有好有坏了。好的是,细分了使用场景,避免迷失在大接口中。​同时,也好进行授权控制。
今天的目标是实现支付宝二维码有效进长配置,从之前电脑网站支付相关的支付宝接口经验上来分析,使用alipay.trade.page.pay​可以实现有效时长控制。但是,老项目采用了alipay.mobile.qrcode.manage​接口,支付宝开放平台都搜索不到这个接口,可想而知,这是一个多老的接口。
抱着试试看的态度问了一下支付宝技术支持。
@蚂蚁金服商户技术支持 alipay.mobile.qrcode.manage 这个接口支持设置二维码过期时间不@蚂蚁金服商户技术支持 转人工不支持设置过期时间@蚂蚁金服商户技术支持 使用哪个版本的支持设置过期时间您这边使用二维码管理接口是需要实现什么功能?@蚂蚁金服商户技术支持 扫码支付设置有效时长这个接口可以设置支付超时时间的。@蚂蚁金服商户技术支持 请给一份详细的完整的文档给我 谢谢支付宝二维码管理接口(关注技术岛公众号,回复alipay获取支付宝二维码管理接口文档)
从对话可以看出,支付宝技术支持一开始是说不支持设置有效时长的​。差点就换成alipay.trade.page.pay了,想想要把老接口项目大倒腾一下,挺大的工作量的。还好,支付宝技术支持又答复说支持了,否则一场不可避免的新老接口大梳理无法避免。
关键参数
pay_timeout 支付超时 时间 String 支付超时时间,单位为分钟, 最小 5 分钟最大两天,默认 15 分钟。 可空 30 logo
此参数为 ext_info中成员,直接在原来的接口参数中进行适当的调整,即可以满足二维码扫码时长的控制了。

腾讯云滑块验证码集成|阿里滑块验证码被破解 换个腾讯云验证码 云服务与黑产灰色产业链的爱恨情仇 附送腾讯云99元云主机下单入口

 Yuema约吗?一起学技术,一起成长!学海无涯 高人带路系列

程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点!
关注公众号,进入学海无涯,高人带路模式!!验证码​再难,有人带路,轻松搞定

云服务被越来越多的企业所接受,风险也日趋集中,像阿里滑块验证码被破解了,影响的客户应该​不在少数。阿里按次数收费,无论是正常还是异常使用,收费​照常。单个云服务的接入,存在风险集中,无备选方案。今天分享的腾讯云验证码即是作为阿里滑块验证码​的备选方案。

使用阿里滑块验证码​的风险:

一、产品下线风险

目前阿里已经下线滑块验证码,已经开通的可以正常使用。这项云服务有点像被阿里抛弃的产品,可能不再进一步维护,要做下线处理。风险​可想而知。

二、破解风险与成本风险并存

目前阿里滑块验证码已经被破解,阿里也承认被破解了。但是收费正常,被​刷了,也不退款。​其中的成本风险,也是可想而知。
腾讯云验证码做为阿里滑块验证码的备选方案,今天就来分享一下有关腾讯云验证码的接入​。感觉还是比较简单的,可以结合官方文档与网上的示例进行。
先睹为快
实例导航https://i.zuime.com/2019/10/11/%E8%85%BE%E8%AE%AF%E4%BA%91%E9%AA%8C%E8%AF%81%E7%A0%81%E9%9B%86%E6%88%90/前端示例https://i.zuime.com/tencent/captcha验证接口https://i.zuime.com/tencent/verify?ticket=t02PT9ySVJ80sIcI3xYNU-2CkRrXxquqXcPsdNYstOny7DVDl7i00VqHK4RrTFxIijSv2FXgn0TpXg0aDfc6sTij0Nncf3NUtzV9a89AEJ65YTOqAY6S9gY4A**&[email protected]
文档
验证码后台文档 https://cloud.tencent.com/document/product/1110/36926Web 前端接入文档 https://cloud.tencent.com/document/product/1110/36841

前端代码参考

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  <title>腾讯云验证码 demo</title>    <link rel="stylesheet" type="text/css" href="/css/style.css"/>    <link rel="stylesheet" type="text/css" href="/css/markdown.css"/>  <script src="https://ssl.captcha.qq.com/TCaptcha.js"></script></head><body>腾讯云验证码 demo<button id="TencentCaptcha"     data-appid="2046804662"     data-cbfn="callback"     type="button">验证</button><!--===============================================================================================-->  <script src="/jquery/jquery-3.2.1.min.js"></script>  <script src="/jquery/jquery.datetimepicker.full.min.js"></script>  <script src="/jquery/jquery-confirm.min.js"></script><!--===============================================================================================-->  <script src="/js/main.js"></script>  <script src="/js/jblog-admin.js"></script><script>window.callback = function(res){ console.log(res) // res(用户主动关闭验证码)= {ret: 2, ticket: null} // res(验证成功) = {ret: 0, ticket: "String", randstr: "String"} if(res.ret === 0){     alert(res.ticket);   // 票据     $.get("/tencent/verify",       {         ticket:res.ticket,         randstr:res.randstr       }       ,function(data){       alert(data);     }); }}</script></body></html>

后端代码:agent

package jblog.guohai.org.bll.agent;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import com.tencentcloudapi.captcha.v20190722.CaptchaClient;import com.tencentcloudapi.captcha.v20190722.models.DescribeCaptchaResultRequest;import com.tencentcloudapi.captcha.v20190722.models.DescribeCaptchaResultResponse;import com.tencentcloudapi.common.Credential;import com.tencentcloudapi.common.exception.TencentCloudSDKException;import com.tencentcloudapi.common.profile.ClientProfile;@Servicepublic class TencentCaptchaAgent {  /**   * 网关地址   */  @Value("${tencent.secretId}")  private String secretId;  @Value("${tencent.secretKey}")  private String secretKey;    /**   * 网关地址   */  @Value("${tencent.captcha.captchaAppId}")  private Long captchaAppId;  @Value("${tencent.captcha.appSecretKey}")  private String appSecretKey;      public String verify(String ticket,String randstr,String userIp){     try{              // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey              Credential cred = new Credential(secretId, secretKey);                            // 实例化要请求产品(以cvm为例)的client对象              ClientProfile clientProfile = new ClientProfile();              clientProfile.setSignMethod(ClientProfile.SIGN_TC3_256);              CaptchaClient client = new CaptchaClient(cred, "ap-beijing", clientProfile);                            // 实例化一个请求对象              DescribeCaptchaResultRequest req = new DescribeCaptchaResultRequest();              req.setCaptchaType(9L);              req.setTicket(ticket);              req.setCaptchaAppId(captchaAppId);              req.setAppSecretKey(appSecretKey);              req.setRandstr(randstr);              req.setUserIp(userIp);                                          // 通过client对象调用想要访问的接口,需要传入请求对象              DescribeCaptchaResultResponse resp = client.DescribeCaptchaResult(req);                            // 输出json格式的字符串回包              System.out.println(DescribeCaptchaResultRequest.toJsonString(resp));              return DescribeCaptchaResultRequest.toJsonString(resp);          } catch (TencentCloudSDKException e) {                  System.out.println(e.toString());                return e.toString();          }  }}

后端代码 :控制器

package jblog.guohai.org.web;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import jblog.guohai.org.bll.agent.TencentCaptchaAgent;/** * 腾讯云 *  * @author zhongdaiqi * */@Controller@RequestMapping("/tencent")public class TencentController {  @Autowired  private TencentCaptchaAgent tencentCaptchaAgent;  @RequestMapping(value = "captcha")  public String captcha(Model model) throws Exception {    return "tencent/captcha";  }  @RequestMapping(value = "verify")  @ResponseBody  public String verify(Model model, String ticket, String randstr,HttpServletRequest request) throws Exception {    return tencentCaptchaAgent.verify(ticket, randstr,request.getRemoteAddr());  }}

后端代码:POM包

<dependency>        <groupId>com.tencentcloudapi</groupId>        <artifactId>tencentcloud-sdk-java</artifactId>        <!-- go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version. -->        <!-- 请到https://search.maven.org/search?q=tencentcloud-sdk-java查询最新版本 -->        <version>3.0.95</version>    </dependency>

以上代码仅供参考,未处理坏味道,​请谨慎使用!获取完整的可运行项目代码方式:关注公众号,回复”tencent”​。

关注公众号Yuema约吗,每天进步一点点

腾讯云福利

​【新用户限量秒杀】热门云产品限量秒杀,云服务器1核1G 首年99元

识别二维码进入活动现场!

作者:钟代麒

出处:http://www.jishudao.com/
版权归作者所有,转载请注明出处

支付宝网银直连SDK封装记下|强力去掉支付宝网银直连DEMO中56个坏味道 余下6个坏味道 Sonarqube无视阿里支付宝光环

 Yuema约吗?一起学技术,一起成长!学海无涯 高人带路系列

程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点!
关注公众号,进入学海无涯,高人带路模式!!支付再难,有人带路,轻松搞定

每次看动漫看美剧,都有狗血的前情回顾,占了好长的时间,有种说不同的酸痛感!腰疼!想不到,我也活成了自己讨厌的人,我也要写个前情回顾 

前情回顾

上回讲到接阿里蚂蚁金服支付宝网银直连的整体代码结构,提到封装了一个alipay-bankpay-sdk,并画了2个对比图,介绍了一下这么干的好处,代码清晰,通用性强。按文章的条理来讲,您应该先看上篇,再来看这篇。

关注Yuema约吗公众号,回复”bankpay”,查看《支付宝网银直连SDK封装记上|强力去掉支付宝网银直连DEMO中56个坏味道 余下6个坏味道 Sonarqube无视阿里支付宝光环》

本文向导

本文主要分享一下封装支付宝网银直连sdk的思路、坏味道清理,并做个小小的总结。完整的看完本文,您应该学会一种取巧的sdk封装思路并能运行于实战,并且能看到一些更加简洁的代码写法,并能学会如何从BTA中学东西,并从中剔除不良习惯。

封装思路

虽然阿里支付宝的程序员在代码中明确表明给出来的demo仅供参考blabla的。但是整体上来讲,封装sdk还是主要使用他们的demo,从作为sdk的角度对代码进行细微调整。

/* * *类名:AlipaySubmit *功能:支付宝各接口请求提交类 *详细:构造支付宝各接口表单HTML文本,获取远程HTTP数据 *版本:3.3 *日期:2012-08-13 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */

封装思路一

做为sdk,我去掉了demo中的AlipayConfig.java,因为不同的项目所使用到的商户号、密钥等都不相同,放在sdk中,不妥当。去掉AlipayConfig.java后,其他的代码要相应的调整一下。我们将配置以参数的形式,传递进去。这样子确保,我们能通过其他方式配置网银直连所需的商户信息。我采用了这种思路,很简单很傻瓜式的调整一下。

封装思路二

可以参考最新的支付宝sdk的封装方式,抽象一个AlipayClient出来,初始化的时候,把AlipayConfig.java的工作做了。我没有使用这种思路,但是感觉这是一种不错的思路。调整稍微大点。

坏味道清理

程序的世界可以说很大很大,咱们就像盲人摸象。坏味道清理是将代码中不规范不合理的地方进行调整。通过使用sonarqube对阿里的网银直连demo进行扫描,发现了56个坏味道,还有1个bug,1个漏洞。

坏味道1:命名空间不规范

支付宝com.alipay.util.httpClientcom.alipay.util.httpclient

坏味道2:冗余写法,不够简洁

Replace the type specification in this constructor call with the diamond operator ("<>"). (sonar.java.source not set. Assuming 7 or greater.)            List<String> keys = new ArrayList<String>(sPara.keySet());            List<String> keys = new ArrayList<>(sPara.keySet());

坏味道3:多余的转化

String name = (String) keys.get(i);Remove this unnecessary cast to "String".

坏味道4:直接返回即可

String strResult = response.getStringResult(charset);return strResult;Immediately return this expression instead of assigning it to the temporary variable "strResult".

坏味道5:这里不要线程安全

Replace the synchronized class "StringBuffer" by an unsynchronized one such as "StringBuilder".StringBuffer result = new StringBuffer();

坏味道6:静态类不要初始化

Add a private constructor to hide the implicit public one.

坏味道7:一行代码搞定

修改前:if (isSign && responseTxt.equals("true")) {            return true;        } else {            return false;        }Replace this if-then-else statement by a single return statement.修正后:return isSign && responseTxt.equals("true");

坏味道8:局部变量命名不规范

input_charsetRename this local variable to match the regular expression '^[a-z][a-zA-Z0-9]*$'.

坏味道9:static final变量命名不规范

 public static final String dtLong                  = "yyyyMMddHHmmss";  Rename this constant name to match the regular expression '^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$'.

坏味道10:参数不符合规范

Rename this local variable to match the regular expression '^[a-z][a-zA-Z0-9]*$'.private static boolean getSignVeryfy(Map<String, String> Params, String sign,String signType,String key,String charset)

坏味道11:局部变量命名不符合规范

String veryfy_url = HTTPS_VERIFY_URL + "partner=" + partner + "&notify_id=" + notify_id;Rename this local variable to match the regular expression '^[a-z][a-zA-Z0-9]*$'.

坏味道12:多此一举

inputLine = in.readLine().toString();"readLine" returns a string, there's no need to call "toString()".

坏味道13:一行代码搞定

Replace this if-then-else statement by a single return statement.if(mysign.equals(sign)) {Replace this if-then-else statement by a single return statement.clumsy            return true;        }        else {            return false;        }

坏味道14:局部变量命名不规范

Rename this local variable to match the regular expression '^[a-z][a-zA-Z0-9]*$'.private static String verifyResponse(String notify_id,String partner)

坏味道15:抛异常不规范

public static String query_timestamp(String partner,String charset) throws MalformedURLException, DocumentException, IOExceptionRemove the declaration of thrown exception 'java.net.MalformedURLException' which is a subclass of 'java.io.IOException'.

坏味道16:Use a StringBuilder instead

Use a StringBuilder instead.StringBuilder  prestr = new StringBuilder();        for (int i = 0; i < keys.size(); i++) {            String key = keys.get(i);            String value = params.get(key);            if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符               prestr.append(key + "=" + value);            } else {               prestr.append(key + "=" + value + "&");            }        }        return prestr.toString();    String prestr = "";        for (int i = 0; i < keys.size(); i++) {            String key = keys.get(i);            String value = params.get(key);            if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符                prestr = prestr + key + "=" + value;            } else {                prestr = prestr + key + "=" + value + "&";            }        }        return prestr;

坏味道17:不规范的变量命名

private static String              DEFAULT_CHARSET                     = "GBK";Rename this field "DEFAULT_CHARSET" to match the regular expression '^[a-z][a-zA-Z0-9]*$'.private static final String              DEFAULT_CHARSET                     = "GBK";

坏味道18:不规范的变量命名

/** 默认等待HttpConnectionManager返回连接超时(只有在达到最大连接数时起作用):1秒*/    private static final long          defaultHttpConnectionManagerTimeout = 3 * 1000L;        Rename this constant name to match the regular expression '^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$'.        private static final long          DEFAULT_HTTP_CONNECTION_MANAGER_TIMEOUT = 3 * 1000L;

坏味道19:不规范的变量命名

Iterate over the "entrySet" instead of the "keySet".When only the keys from a map are needed in a loop, iterating the keySet makes sense. But when both the key and the value are needed, it's more efficient to iterate the entrySet, which will give access to both the key and value, instead.for (String key : sArray.keySet()) {            String value = sArray.get(key);            if (value == null || value.equals("") || key.equalsIgnoreCase("sign")                || key.equalsIgnoreCase("sign_type")) {                continue;            }            result.put(key, value);        }                for (Entry<String,String> entry : sArray.entrySet()) {            String key = entry.getKey();            String value = entry.getValue();            if (value == null || value.equals("") || key.equalsIgnoreCase("sign")                || key.equalsIgnoreCase("sign_type")) {                continue;            }            result.put(key, value);        }

坏味道20:漏洞

Use a logger to log this exception.try {            URL url = new URL(urlvalue);            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();            BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));            inputLine = in.readLine();        } catch (Exception e) {            e.printStackTrace();//漏洞            inputLine = "";        }

还有几个坏味道,我也不想修改了。

从56个坏味道来看,变量命名规范、线程安全、代码简洁度、性能都有涉及,可以说阿里支付宝提供的这个demo,将一堆坏味道传染给了千千万万程序员。其实,也不用太惊慌,使用sonarqube这个开源的工具进行代码质量检查,就能防坑于未然,即能享受支付宝的demo成果,也能做得更好。
网银直连的demo比较老,最近看阿里支付宝的sdk,还是很规范的。不过,网银直连还是得在坑里爬行。希望这两篇支付宝网银直连的经验分享,能让更多的小伙伴快速出坑,节省些时间~

关注Yuema约吗公众号,回复”sq”,学习sonarqube代码质量检查工具使用与安装。

关注Yuema约吗公众号,回复”bankpay”,查看《支付宝网银直连SDK封装记上|强力去掉支付宝网银直连DEMO中56个坏味道 余下6个坏味道 Sonarqube无视阿里支付宝光环》,了解代码结构的艺术。

作者:钟代麒

出处:http://www.jishudao.com/
版权归作者所有,转载请注明出处

支付宝网银直连SDK封装记上|强力去掉支付宝网银直连DEMO中56个坏味道 余下6个坏味道 Sonarqube无视阿里支付宝光环

 Yuema约吗?一起学技术,一起成长!学海无涯 高人带路系列

程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点!
关注公众号,进入学海无涯,高人带路模式!!微服务再难,有人带路,轻松搞定

名词约定
网银直连,通过第三方支付平台(比如支付宝)直接跳到银行的网上银行界面,不显示第三方平台支付界面(比如支付宝)。支付宝也称相关接口为《纯网关接口-create_direct_pay_by_user(20170526).zip》。
正文
蚂蚁金服支付宝网银直连是最难接的支付了,难不再于技术,在于技术前端的商务关。在线客服不再签约不给开通,只能联系客户经理走线下邮件开通。体验相当不好。今天依据支付宝提供的DEMO,封装了一个支付宝网银直连SDK。之所以要自己封装,是因为现有的alipay-sdk-java 4.6.0.ALL压根不包括网银直连接口。
<!-- 支付宝 https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->          <dependency>              <groupId>com.alipay.sdk</groupId>              <artifactId>alipay-sdk-java</artifactId>              <version>4.6.0.ALL</version>          </dependency>
为什么要封装
做为第三方代码,揉在项目里,显得有些突兀。封装出来,以后要使用,也可以直接引用进来使用。
   <!-- 支付宝网银直连SDK -->      <dependency>        <groupId>com.zhongdaiqi.alipay</groupId>        <artifactId>alipay-bankpay-sdk</artifactId>        <version>1.0.0</version>      </dependency> 
如果不封装,项目代码就膨胀起来了,也不够清晰。单独把网银直连的代码打包在一个SDK里,不仅让现有代码清晰。而且新项目也可以方便的使用。不用COPY多处代码,只需要引入sdk并将agent类copy过来。也是很方便的使用体验。
未封装的图示感觉

未封装的话,代码被打散在项目的角落里,对于这种“外来”代码,怎么可以跟小清新无坏味道的代码混在一起呢?
封装后的图示感觉

网银直连所使用到的验签、创建网银直连支付宝订单等相关的类都统一打包在这个AlipayBankSDK中。可方便的应用到多个项目中。
刚才有说到我们项目代码经过Sonarqube洗礼,清理了绝大数坏味道,而第三方的代码打包在sdk里就不用去坏味道么?当然,也是要去的。风格不统一,命名不符合我们的规范。自己封装,就自己清理吧!

       封装sdk的方法、清理坏味道的方法、从支付宝网银直连demo中发现的坏味道清单,请看篇的姐妹篇《支付宝网银直连SDK封装记下|强力去掉支付宝网银直连DEMO中56个坏味道 余下6个坏味道 Sonarqube无视阿里支付宝光环》

关注Yuema约吗公众号,回复”bankpay”,查看《支付宝网银直连SDK封装记下|强力去掉支付宝网银直连DEMO中56个坏味道 余下6个坏味道 Sonarqube无视阿里支付宝光环》

关注Yuema约吗公众号,每天都有新收获

作者:钟代麒

出处:http://www.jishudao.com/
版权归作者所有,转载请注明出处

宜信星火金服月标来袭 新手292元红包邀请 月标加新手红包综合预期年化近30% 体验国内大平台专业服务 13年风控护航 疯抢月标

宜信是国内P2P网贷领域的创始企业,拥有13年风控实战经验,宜信推出的星火金服新手红包为292元,预期年化8.5%,使用新手红包,综合预期年化近30%。做为一款新手体验产品,备受网贷圈的欢迎,也是一款爆品。通过邀请链接二维码可获得​新手体验红包!

周期短,30天左右,可观的预期收益,新手注册后​必选的一款网货产品。新手注册后,一定要记得使用新手红包,仅能使用一个​。目前网贷圈最流行的选择是166红包+新手标(预期年化8.5%)。到期后,可直接提现,也可以续投。新手产品为体验产品,仅限新手体验。

抢标​小秘籍:

  1. 月标每天有额度限制,注册后要及时抢
  2. 每天会补充额度,没有抢到不要灰心,次日关注
  3. 宜信大数据风控有防羊毛党机制,被系统检查到恶意刷新红包,可能会被系统限制,无法查看到月标​,长期标可正常投。羊毛党要三思而行​。
  4. 如果月查看不到,可以等系统补充,也不要太​沮丧。
  5. 额度提醒服务可以加微信13439975582​ 注明:宜信抢标

网贷有风险 投资请谨慎