让天底下没有难接的支付|支付宝网银直连&转账到银行卡对接故事续集 支付对接不是一个单纯技术问题 网银直连转账到银行卡开通方式揭晓

话说接支付宝的故事已经有几个回合了,30年河东,30年河西,之前的支付宝已经不再是之前的支付宝啦,从技术上来讲,变得越来越古怪了。接口都被当成产品,各种需要签约啦。今天的重点在于支付宝网银直连、转账到银行卡两个接口,故事的来来回回已经越约了技术层面,俨然成了一场非技术层面拉锯。读完本故事,您应该懂得怎么开通支付宝网银直连、转账到支付宝,故事写于2019年9月29日下午16点46分。如果支付宝变来变去,故事也可能成为历史传奇,不再有效。

一、捉摸不透的官方客服

向官方客服进行咨询的话,先是机器人伺候,再到人工客服,统一都是说网银直连下线了、转账到银行卡下线了,无在线签约入口。蹊跷的是,在线客服提供可至电xxxx咨询,联系业务经理云云。

二、线下业务经理的快速通道

原来被当成无解的支付宝网银直连&转账到银行卡,竟然在支付宝业务经理BD的线下邮件开通方式下,可以开通。这已经不再是技术领域的问题了。看接口路径中的pre-open,文档顶部标明了定向开放文档。这些接口不签约,统统是不生效了,参考文档开发,也调不通。能走线下就不要去走线上,感觉线下就像一个绿色通道,无所不能。

2.1 支付宝网银直连

网银直连的文档看起比较老旧,像是之前的支付宝对接文档。demo也不难,不过,不签约的话,照着demo做,也无法直接跳到网银。官方提供的demo是java jsp版本,有点小小的不适应。

依据官方demo,转了一份Spring MCV版本

@RequestMapping(value = "api")  public String api(Model model, HttpServletRequest request) throws Exception {    // 支付类型    String payment_type = "1";    // 必填,不能修改    // 服务器异步通知页面路径    String notify_url = "https://i.zuime.com/create_direct_pay_by_user-JAVA-UTF-8/notify_url.jsp";    // 需http://格式的完整路径,不能加?id=123这类自定义参数    // 页面跳转同步通知页面路径    String return_url = "https://i.zuime.com/create_direct_pay_by_user-JAVA-UTF-8/return_url.jsp";    // 需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/    // 商户订单号    String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"), "UTF-8");    // 商户网站订单系统中唯一订单号,必填    // 订单名称    String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"), "UTF-8");    // 必填    // 付款金额    String total_fee = new String(request.getParameter("WIDtotal_fee").getBytes("ISO-8859-1"), "UTF-8");    // 必填    // 订单描述    String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"), "UTF-8");    // 默认支付方式    String paymethod = "bankPay";    // 必填    // 默认网银    String defaultbank = new String(request.getParameter("WIDdefaultbank").getBytes("ISO-8859-1"), "UTF-8");    // 必填,银行简码请参考接口技术文档    // 商品展示地址    String show_url = new String(request.getParameter("WIDshow_url").getBytes("ISO-8859-1"), "UTF-8");    // 需以http://开头的完整路径,例如:http://www.商户网址.com/myorder.html    // 防钓鱼时间戳    String anti_phishing_key = "";    // 若要使用请调用类文件submit中的query_timestamp函数    // 客户端的IP地址    String exter_invoke_ip = "";    // 非局域网的外网IP地址,如:221.0.0.1    //////////////////////////////////////////////////////////////////////////////////    // 把请求参数打包成数组    Map<String, String> sParaTemp = new HashMap<String, String>();    sParaTemp.put("service", "create_direct_pay_by_user");    sParaTemp.put("partner", AlipayConfig.partner);    sParaTemp.put("seller_email", AlipayConfig.seller_email);    sParaTemp.put("_input_charset", AlipayConfig.input_charset);    sParaTemp.put("payment_type", payment_type);    sParaTemp.put("notify_url", notify_url);    sParaTemp.put("return_url", return_url);    sParaTemp.put("out_trade_no", out_trade_no);    sParaTemp.put("subject", subject);    sParaTemp.put("total_fee", total_fee);    sParaTemp.put("body", body);    sParaTemp.put("paymethod", paymethod);    sParaTemp.put("defaultbank", defaultbank);    sParaTemp.put("show_url", show_url);    sParaTemp.put("anti_phishing_key", anti_phishing_key);    sParaTemp.put("exter_invoke_ip", exter_invoke_ip);    // 建立请求    String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get", "确认");    model.addAttribute("page", sHtmlText);    return "pay/alipay/mapi/api";

重点参数在paymethod、defaultbank。

String paymethod = "bankPay";//网银直连
String defaultbank= "CMB";//银行简码,参考支付宝对接文档详细说明

PS:敲黑板画重点,没有签约的话,是无法跳过去的,这些参数都不会生效,依旧会跳到支付宝的支付界面,而不是网银。

2.2 转账到银行卡

支付宝转账到银行卡https://docs.alipay.com/pre-open/api_pre/alipay.fund.trans.tobank.transfer

发起转账到银行卡后,支付宝会返回很详细的错误信息。

错误码 错误描述 解决方案
INVALID_PARAMETER 参数有误。 请根据入参说明检查请求参数合法性。
SYSTEM_ERROR 系统繁忙 可能发生了网络或者系统异常,导致无法判定准确的转账结果。此时,商户不能直接当做转账成功或者失败处理,可以考虑采用相同的out_biz_no重发请求,或者通过调用“(alipay.fund.trans.order.query)”来查询该笔转账订单的最终状态。
EXCEED_LIMIT_SM_AMOUNT 单笔额度超限 请根据接入文档检查amount字段
EXCEED_LIMIT_DM_AMOUNT 日累计额度超限 请根据接入文档说明检查本日请求总金额+本次请求金额是否超限。
EXCEED_LIMIT_MM_AMOUNT 月累计金额超限 请根据接入文档说明检查本月请求总金额+本次请求金额是否超限。
PAYCARD_UNABLE_PAYMENT 付款账户余额支付功能不可用 请付款账户登录支付宝账户开启余额支付功能。
PAYER_STATUS_ERROR 付款账号状态异常 请检查付款方是否进行了自助挂失,如果无,请联系支付宝客服检查用户状态是否正常。
PAYER_CERTIFY_CHECK_FAIL 付款方人行认证受限 付款方请升级认证等级。
PAYER_STATUS_ERROR 付款方用户状态不正常 请检查付款方是否进行了自助挂失,如果无,请联系支付宝客服检查用户状态是否正常。
PAYER_BALANCE_NOT_ENOUGH 付款方余额不足 支付时间点付款方余额不足,请向付款账户余额充值后再原请求重试。
PAYER_USER_INFO_ERROR 付款用户姓名或其它信息不一致 检查付款用户姓名payer_real_name与真实姓名一致性。
PAYMENT_INFO_INCONSISTENCY 两次请求商户单号一样,但是参数不一致 如果想重试前一次的请求,请用原参数重试,如果重新发送,请更换单号。
CARD_BIN_ERROR 收款人银行账号不正确 请确认收款人银行账号正确性,要求为借记卡卡号。
PAYEE_CARD_INFO_ERROR 收款方卡信息错误 请联系收款方确认卡号与姓名一致性。
INST_PAY_UNABLE 资金流出能力不具备 可能由于银行渠道在维护或无T0渠道,与联系支付宝客服确认。
PAYER_ACC_OCUPIED 付款人登录账号存在多个重复账户,无法确认唯一 如果未传输payer_account_name,请传入payer_account_name; 如果传入了payer_account_name,则是由于登录账号对应的多个重复账户的真实姓名一致,请更换登录号。
MEMO_REQUIRED_IN_TRANSFER_ERROR 根据监管部门的要求,单笔转账金额达到50000元时,需要填写付款理由 请填写remark或memo字段。
PERMIT_CHECK_PERM_IDENTITY_THEFT 您的账户存在身份冒用风险,请进行身份核实解除限制 您的账户存在身份冒用风险,请进行身份核实解除限制

依据官方提示,状态可以通过alipay.fund.trans.order.query接口进行查询核实。而官方的接口描述,又给出了神奇的描述。

https://docs.open.alipay.com/api_28/alipay.fund.trans.order.query

 * 转账单据状态。  SUCCESS:成功(配合"单笔转账到银行账户接口"产品使用时, 同一笔单据多次查询有可能从成功变成退票状态);  FAIL:失败(具体失败原因请参见error_code以及fail_reason返回值);  INIT:等待处理;  DEALING:处理中;  REFUND:退票(仅配合"单笔转账到银行账户接口"产品使用时会涉及, 具体退票原因请参见fail_reason返回值);  UNKNOWN:状态未知。   */  @ApiField("status")  private String status;

经典问题

SUCCESS:成功(配合"单笔转账到银行账户接口"产品使用时, 同一笔单据多次查询有可能从成功变成退票状态);请告诉我,什么时候才能一个转账的状态能最终定下来不能说多次查询,又从成功变成了退票请告之你们的转账到银行卡状态,在什么时候才能明确的认定为成功状态,而不是有可能从成功状态变成退票状态

感觉接口死循环了。发起转账状态要查询,查询状态又可能从成功变成退款,很是尴尬的局面。支付宝客服一直未给一个明确的答复,一个下午都在等答复。

写在收尾处

对接蚂蚁金服支付宝的网银直连、转账到银行卡,不是一个技术问题,而商务签约问题,不签约,不给文档,不给文档没有下文​。对于技术人来讲,收藏一份网银直连、转账到银行卡文档,是很有必要的。估计签名还没有签约,功能都可以提前​开发好了。

让天底下没有难接的支付

关注公众号【Yuema约吗】回复alipay,获取支付网银直连、转账到银行卡技术文档

ps:不签约接口不生效,但是可以提前开发

让天底下没有再难的微服务 一份有码有图的微服务教程分享| 找出教程Bug,还有礼品相送,学海无涯大师带路 行江湖,品微服务之美

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

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

作者:钟代麒

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

小白也能玩微服务|站点巨人肩上 玩玩微服务! 微服务虽好,可要三思!带不动节奏,肿么可能?源代码,分析,高人带路,相信你不会不懂

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点!
关注公众号,可获取每日分享!小手点点,即可关注!

老是说微服务,微服务,有几个人在使用微服务,微服务真的好么?有必要使用么?怎么使用?怎么入门,怎么玩起来?今天先聊聊微服务,再原汁原味分享一位大神官方授权的小白带路篇微服务入门教程。

一、微服务的好 锁住构建规模

微服务是一种趋势?是的,随着系统越来越庞大,功能越来越多,“传统”的工程结构,会让今天的小伙伴,拖着10年前的老代码一起构建,有种心累的感觉。光构建一下,就很废时间,超过20分钟,是不是有种找PO哭的节奏,明明很简单的一个功能,明明一个简单的bug,却花了大量的时间等。有种前人挖坑,后人爬的节奏。微服务,可能破解了这个困境,让工程不再无止境的线性膨胀。

二、微服务好 防止业务拖累 防止代码污染

一个好端端的业务,运行稳定,每次发布部署新东西,都不相关,却要被影响一下,有种被拖累的不爽。微服务可能在防止不相关的业务拖累这块有所建树。同时,代码都分开,被污染到的可能性也就小了。pom包里新增加个东西,出现jar包冲突,是一件很不爽的事情,尤其在10年前一个老包,跟新包出现不可调和的冲突。

真的那么好么?当公司的业务规模达到一定程度,微服务是有所帮助的。但是,如果,那么就要好好想想了。

一、微服务不好 工程结构变得玄幻

当我打开一个支付集成的微服务项目,我已经找不到北,工程结构变得异常丰富,需要付出额外的学生成本。研发、部署都发生了变化。不过,不过,微服务的架子搭起来之后,也就按部就班,跟普通研发并无太大的变化。

二、微服务不好 学习维护成本高了

如果没有人带,微服务,真心不好玩。如果只是一个简单的功能,公司也没有成本走微服务,其实不玩微服务也好。玩微服务之后,就意味着,学习成本高了点。

好与不好,总是相伴相生,那对于小白来说,怎么掌握微服务呢?今天是拿到了官方授权,来Show一波小白教程,让天下没有再难的微服务。

https://github.com/zhongdaiqi/spring-cloud-example

关注公众号,查看教程更新
  • 创建微服务项目(Spring Boot)
  • 安装Consul服务中心
  • 注册服务到服务中心(Consul)
  • 创建Consul客户端项目
  • 调用Consul服务(消费服务)
  • 创建网关项目
  • Spring Cloud Gateway注册到服务器中心(Consul)
  • 网关中加入熔断机制
  • Consul集群Server模式
  • Consul集群Server+Client模式
  • Consul集群加入网关服务

For Boss

不要盲目追随微服务,重点考虑一下当前业务规模,业务系统简单、又没几个访问量,又没有钱,就不要微服务了。简单的也不错。

For 同行

快点学微服务,用得起微服务的公司,都是达到一定境界的公司。

学海无涯 高人带路

作者:钟代麒

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

南方人如何学会吃面就生蒜|破解北方人吃面吃生蒜小秘密 你不是吃不惯只是没人带 吃面这么吃生蒜 感觉纯正自然吃面小技巧

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点!
关注公众号,可获取每日分享!小手点点,即可关注!

南方人来到北方会发现很多有趣的“不良”习俗,吃面竟然要就着生蒜吃,简直是逆天而行!那味道那感觉,有种想哭的节奏。真的是不良习俗么?这里面隐藏着什么秘密呢?今天带大概10年上百次实验观察结果,破解其中的小秘密。

为了分析出其中的秘密,分互联网搜索、实验分组实验两大“研究”方法寻找其中的秘密。首先,不造轮子,看看前人是怎么个观点,经过多次寻找“海量”文献,都是这么说的。

一、健康因素

因为大蒜里包含有大蒜素,可以杀菌。一看就是从养生保健的角度来用脚思考的节奏。最开始,也感觉很有道理。随着时间推移,越来越觉得不靠谱。从养生角度,就是瞎BB,不中要点,不可取。还在以此为执念的南方人千万要走出这个误区,不然,永远不能领悟吃生蒜的秘密。

二、好吃

还有一种观点,这是历史流传下来的吃法,好吃。找几个南方人问问,好吃不好吃。吃着都想哭,泪流满面的节奏。说好吃也片面了。单纯说好吃,也站不住脚。谁说好吃,回个好吃个鬼。

想靠搜索找到答案,也是醉了,还得自己分析一下长期以来的观察。为了更好的推理,将观察的“实验组”分成几类。每次做实验,大概都得花15元,很多次都是吃一口,就终止了实验。“科研”成本,也是花了不少不少,而且是自费成本。

第一类实验 纯面不就蒜

纯面不就蒜,是什么节奏。来看一碗拉面,感受一下这波真实的拉面。

南方人能看出什么来?怎么这面跟童年的面条很不一样。单纯看碗里的成分,超级单调,可以简单的总结为,TMD,啥也没有。如何发一碗南方的面上来(唉,没有素材),对比一下就会发现。南方的面,更加丰富,配料,更为有味。所以,南方人在北方吃面,其实是一件很尴尬的事情,没什么味道,吃几口就想放弃。

第二类实验 纯面就蒜

这类实验,往往是痛哭流泪的场面。咬一口蒜,那辛辣那难受的节奏,有种怀疑人生。这么难吃,为啥让很多人喜欢?显然这个实验组划得太粗,于是拆解成两个小实验。

小实验一 啥不垃圾的吃法  嚼与吞咽并存

这种味道就生生体会生蒜的味道,有种粘着口腔黏膜,灼烧的不适感。很受虐的节奏。这种吃法,属于,错误的吃法,也是大部分南方人无法适应吃面吃蒜的原因。

小实验二 科学合理的吃法 嚼而不吞咽 等面一起吞咽

这个实验也是吃面生生蒜,吃法有所调整。嚼而不吞咽,等面一起吞咽。吃蒜会带来一种刺激,吃面能中合这种刺激,就像吃到咸的东西,赶紧喝点白开水冲淡一下。如果嚼与吞咽并存,就只是吃蒜,刺激过头,难受。而嚼而不吞咽,等面一起吞咽,则能在舒适的刺激程度。

以上实验坚持做了10多年,总得来看,吃蒜是很刺激难受,光吃生蒜是让人无法接受的。但是,面能中合这种刺激,让索然无味的面,带着点刺激,有点神奇的化学反应。所以,不能单纯说生蒜好吃,只有正确的吃法,掌握科学合理的技巧,南方人才能征服吃面就生蒜的北方风俗。

有木有Get到点 快去挑战一下

作者:钟代麒

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

看完一个外挂 我竖起了大拇指 | Yuema约吗 记录技术点点滴滴 | 从外挂看程序化运营 孰是孰非 与技术何干?骚年大胆玩起来

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点!
关注公众号,可获取每日分享!小手点点,即可关注!

这两天在分析一个外挂,当我看到这个外挂的时候,我惊呆了!分布式、策略配置、机器学习、机器视觉、钩子、自动化,高大上的关键词都踩到了!我不由得竖起了大拇指!真的很想膜拜一下外挂幕后的大码农!

抓TA?

这是一个让人非常难过的消息,外挂作者要被当成非法入侵计算机系统,被抓起来!这已经超出技术的范围,单纯从技术上来讲,外挂实现了官方平台未曾实现的功能,而且技术玩得都不简单,没有一定的功力,是组装不出强大的外挂。从非技术角度来讲,有人的地方就有江湖,触及到多方利益的时候,就得谈谈法律,谈谈期限了

猫鼠游戏

写外挂,就是与官方平台玩猫鼠游戏,见不得光,还得与官方平台的防挂机制不断的斗争。(行文中暴露了我倒戈外挂,政治立场不坚定,哈哈)真的很佩服外挂作者们所付出的努力,他们玩的技术与AI何等的神似。我看到的这个外挂,曾经应该是一个全自动的外挂,被官方防外挂机制,毁灭成半自动了。不过,看外挂作者并没有放弃努力。机器视觉、机器学习都用上了。这场游戏的过程,外挂作者得不断跟进官方程序,不断更新,不断的绕过防刷机制!想想,累不?

外挂博弈

抢火车票外挂,抓不抓?携程也提供抢火车票,抓不抓?很多互联网都蹭火车票流量,抓否?

外挂 vs AI

如果狠TA,就叫邪恶外挂,如果喜欢TA,就叫智慧AI.无所谓对与错,在于我们看问题的角度。不要狠外挂,对于技术人来讲,掌握了外挂技术,也是一笔财富!

作者:钟代麒

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

蚂蚁金服支付宝花呗分期支付接入实战分享|分分钟钟快速接入demo 企业开通接入花呗支付就是这么easy 想分就分 花呗技术走一波

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点!
关注公众号,可获取每日分享!小手点点,即可关注!

今天的目标是接通平安银行,正好看到花呗,就玩了一下花呗。还是很快的,在原来的支付基础上,做一些小的改动就可以支付花呗支付。当然,是两方面的事情,一要到支付宝后台签约花呗动作,并在开放平台将花呗支付能力加到应里,感觉有点怪怪,就一口气把所有的“能力”都追加了进去。二是代码啦!

先睹为快,体验链接直接拍上

#更新日志 2019.09.18 增加花呗支付demo https://i.zuime.com/order/alipay/payqrhb

这个码是直接设置了花呗分期的,可以直接扫码,会有分期付款的提示。感觉手续续还是不低哦~具体可以自己扫码感受一下。

代码小调整

public String tradePagePayQrHb(AlipayOrderBean orderBean) throws Exception {    AlipayClient alipayClient = buildAlipayClient();    AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();    AlipayTradePagePayModel model = new AlipayTradePagePayModel();    //request.setReturnUrl(returnUrl);    request.setNotifyUrl(notifyUrl);    model.setOutTradeNo(orderBean.getOutTradeNo());    model.setSubject(orderBean.getSubject());    model.setTotalAmount(orderBean.getTotalAmount());    model.setBody(orderBean.getBody());    model.setProductCode(orderBean.getProductCode());    model.setQrPayMode("4");    model.setQrcodeWidth(200L);    //model.setTimeExpire("2m");    model.setTimeoutExpress("2m");    ExtendParams params = new ExtendParams(); //花呗分期控制    params.setHbFqNum("3");    params.setHbFqSellerPercent("0");    model.setExtendParams(params);    request.setBizModel(model);    request.setNeedEncrypt(true);    return alipayClient.pageExecute(request).getBody();  }

花呗分期支付调的接口也是AlipayTradePagePay,只是传参数的时候多传了一下花呗分期参数。

    ExtendParams params = new ExtendParams(); //花呗分期控制    params.setHbFqNum("3");    params.setHbFqSellerPercent("0");    model.setExtendParams(params);

代码均为测试练习代码,请勿直接用于生产环境,代码经过Github.com的ci检查,能正常编译通过,可正常访问。本次花呗分期体验​连接:https://i.zuime.com/order/alipay/payqrhb

没有比较,就没有伤害

综合平安银行对接与支付宝对接,感觉真的是两种完全不同的体验​!传统厂商与互联网企业,完全两种不一样的研发​体验。

支付宝花呗接入,搞定

源代码获取,关注公众号,回复​”alipay”

作者:钟代麒

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

平安银行对接|银企对接扫雷排坑实战经验分享 感受一下财大气粗的银行对接 感受一下等长报文的痛苦 未曾经历无以感受他人在坑中崩溃状

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点!
关注公众号,可获取每日分享!小手点点,即可关注!

今天先是练习了一下支付宝花呗分期对接,很快就搞定了,可以通过以下网址体验​。

http://i.zuime.com/order/alipay/payqrhb

花呗对接完,我就琢磨着平安银行对接,先扫扫雷,至少要将一个接口调​通。向同事要到一堆文档、一个PinganController.cs、一个平安前置软件​。打开前置软件word文档一看,106页,还有好几个文档,这要是一行一行看过来,不仅时间没了,而且不好抓重点。由于就后厚着脸皮问同事了​。

一、平安银行企业前置程序

这个企业前置程序就相当一个请求代理,由平安银行提供​。默认使用的是jdk1.6,也支持1.8,要手动修改一下启动脚本​。尴尬的是,修改完jdk之后,还是跑不起来。一直追着同事问,然后拿到一个新的前置程序​,启动成功。

二、掉等长报文的坑

参考同事的.net版本,感觉有些东西还是要转化来转化去,就直接拿java demo,copy过来改改。结果4001查询余额的交易老是报企业未开通银企​互联。实在是想不到法子,换了好几个对接测试账号,无一​幸免。那就建个空白的工程,把PinganController.cs贴进去,跑起来,4001交易成功​,查到了余额。ps:同事给个cs文件,也是​醉了。.Net成功了,那Java也得成功​啊。梦想是这样子,同事跑来一顿指点,坑在java的demo未做4001报文​名的等长处理。

#net 大概是这么写的,意会一下String xxcode = mmcode =="4001"? "4001    ":mmcode;

java版本则未​做这种特殊处理。修正完之后,​跑起来了。

小目标达成,休息​

小结

相比alipay的对接,平安银行的对接,简直没谁了,要不是有同事踩过一次坑,我不知道在坑里要爬多少天。传统银行跟第三方支付,有种预感觉,还有很多坑即将出现~

作者:钟代麒

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

企业微信机器人邂逅jenkins 打造定时饭点通知机器人 准点提醒,呵护脆弱的胃

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点!
关注公众号,可获取每日分享!小手点点,即可关注!

距离上一版企业微信机器人分享,已经很久很久了,有小伙伴一直问企业微信机器人开发。其实,整体上分两大类。一类是企业微信后台的应用开发,那种是可以做成交互性质的机器人,更麻烦更麻烦,二类是从群聊面板创建的“强势机器人”只发信息,不能进行交互,很简单很简单。

玩转企业微信群聊机器人 用机器人定时提醒饭点 订餐时间 任务时间 下班时间 任务代办事项 每个人都可以快速拥有的一个Robot

今天,要使用jenkins 打造一个更加精致的小机器人。之前的windows作业,有点不友好,弹窗执行。今天的jenkins,无代码,全是配置。jenkins安全,可以参考之前jblog自动构建的文章完成。

JBlog自动构建环境搭建 实战练习jenkins+sh+spring+java+github webhook 自动构建博客系统

jenkins部署提示

1.下载jar包wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war2.启动jar包  nohup java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war  --httpPort=8080 &nohup java -jar /data/jenkins.war --httpPort=8080 &

脚本

官方的示例代码简单的修改一下,就成了本次作业所需要的脚本代码。

curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=33ee91a3-b911-41f9-b86e-006416fe6b70' -H 'Content-Type: application/json' -d '{ "msgtype": "text", "text": {  "content": "饭点到,赶紧脱离工作状态,准备出发!" } }'

作业创建

  1. 选择新建作业
  2. 选择构建一个自由风格的软件项目
  3. 在构建操作中增加脚本,将脚本帖进去。
  4. 构建触发器,选择定时构建,比如早上11点45触发,则输入45 11 * * 1-5,也可以点开旁边的问号查看详细的定时构建周期配置说明。

验证

可以手动点击构建,可以看到机器人在群里发送信息。

饭点到,赶紧脱离工作状态,准备出发!

定时构建在会指定的周期进行构建,执行脚本,发出信息。

结束语

今天分享的jenkins+企业微信机器人打造饭点提醒机器人,比之前的分享更加友好些,无语堆代码,只需要使用第三方开源的产品结合企业微信机人官方demo即可实现,非常简单。如果要实现更复杂的机器人,则需要写更复杂的脚本,留个悬念~

关注公众号,期待吧!

作者:钟代麒

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

支付宝当面付&支付宝网站支付的扫码支付 支付宝RSA2接口集成进阶 网站扫码支付的两种方式 探路支付宝集成的一点小分享 实战经验

 Yuema约吗?一起学技术,一起成长!他山之石,可以攻玉系列

程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点!
关注公众号,可获取每日分享!小手点点,即可关注!

源代码获取

关注公众号[Yuema约吗],回复“alipay”,获取完整示例代码。

今天的小目标是调通支付宝网站支付扫码支付,从最早的一个对接文档变成电脑网站支付、手机网站支付、当面付等支付产品,​不断的在变。对接不再是一个单纯的技术问题,各种签约折腾,​人在江湖,身不由已!今天完成了网站扫码支付的扫雷,文章尾部有获取本次分享的源代码​途径,可以​获取尝试。

​需求

网站支持支付宝扫码支付,要求,直接展示出支付宝二维码,让​客户能直接扫码支付。

困境

扫不到一个合适的产品,预期找到的支付产品应该是扫码支付,但是网站支付、当面付都有些出入。支付宝定义当面付是线下支付产品,这真的是好强势的支付宝​,还管我在哪里扫码。网站支付,就直接跳到支付宝了,不符合​产品需求。

惯性思维

扫码支付,先获取二维码,再支付。网站支付获取的一个页面​啊。第一感觉就是先pass掉网站支付,找新出路。实际上错了,

出路一 当面付

谁挖的坑就找谁,联系支付宝客服咨询了一下,客服说二维收款可以拍当面付的二维码。

由于是赶紧给支付宝开放平台的应用开当面付的权限,提示要签约,拍门脸照片,提申请。照着签约提示,​完成申请。吃完饭回来,通过了。接上,调用支付宝的预生成订单(当面付)接口,拿到的qrcode.

https://qr.alipay.com/bax02697tajnyczwadpl60d0

​坑:这虽然是一个qrcode,但是不是一张图片!​也不是一个iframe。是要把这个连接生成一张图片。找到一个开源的QRCode.js库,​转化成功。

晒代码

<html><head><script src="/jquery/jquery-3.2.1.min.js"></script><script src="/js/qrcode.min.js"></script></head><body><div id="qrcode"></div><div>200001568703071983</div><div><a href="/order/alipay/pay/query?tradeNo=200001568703071983" target="_blank">查询结果</a></div></body><script type="text/javascript">new QRCode(document.getElementById("qrcode"), "https://qr.alipay.com/bax02725xew4ndcdoxvb2030");</script></html>

后台代码

/**   * 预生成订单(当面付)   *    * @param out_trade_no   * @param total_amount   * @return   */  public String precreate(String outTradeNo, String subject, String totalAmount) throws Exception {    AlipayClient alipayClient = buildAlipayClient();    AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();    AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();    model.setOutTradeNo(outTradeNo);    model.setTotalAmount(totalAmount);    model.setSubject(subject);    model.setBody("这是一个 body这是一个 body这是一个 body这是一个 body这是一个 body这是一个 body这是一个 body这是一个 body这是一个 body");    model.setTimeoutExpress("1m");    request.setBizModel(model);    request.setNeedEncrypt(true);    request.setReturnUrl(returnUrl);    request.setNotifyUrl(notifyUrl);    AlipayTradePrecreateResponse response = alipayClient.certificateExecute(request);    // 在这里检查订单的状态值    return response.getQrCode();  }

效果图

体验地址: https://i.zuime.com/order/alipay/pay/qrcode

当面付的效果能满足产品需求,需要自己再完善一下样式,加个支付宝的LOGO。需要前端​加点戏。

出路二 网站支付

如果仔细查网站支付的接口文档,会发现,有参数控制支付页面的显示效果,当我们调整为合适的参数值,就能在iframe里,显示一个二维码大小的窗口,让用户有种页面上拍了个二维码的真实错觉。

两个核心参数

qr_pay_modeqrcode_width

这两个参数取值为”4″,200L的时候,效果不错​。​先看看效果。

效果地址:https://i.zuime.com/order/alipay/payqr

代码

/**   * 网站支付二维码模式   * @param orderBean   * @return   * @throws Exception   */  public String tradePagePayQr(AlipayOrderBean orderBean) throws Exception {    AlipayClient alipayClient = buildAlipayClient();    AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();    AlipayTradePagePayModel model = new AlipayTradePagePayModel();    //request.setReturnUrl(returnUrl);    request.setNotifyUrl(notifyUrl);    model.setOutTradeNo(orderBean.getOutTradeNo());    model.setSubject(orderBean.getSubject());    model.setTotalAmount(orderBean.getTotalAmount());    model.setBody(orderBean.getBody());    model.setProductCode(orderBean.getProductCode());    model.setQrPayMode("4");    model.setQrcodeWidth(200L);    //model.setTimeExpire("2m");    model.setTimeoutExpress("2m");    request.setBizModel(model);    request.setNeedEncrypt(true);    return alipayClient.pageExecute(request).getBody();  }

小结:

实现网站扫码支付,可以采用支付宝的网站支付产品或当面付产品,当面付的二维码是自主生成,灵活性更强;网站支付中二维码模式是支付宝返回的一个完整的HTML页面,灵活性更低,简单粗暴,需要使用iframe来​承载。如果个性化需求不强烈,网站扫码支付可以使用支付宝的网站支付产品,传参的时候,调整为二维码模式。

源代码获取

关注公众号[Yuema约吗],回复“alipay”,获取​完整示例代码。

相关阅读

支付宝RSA2支付|小实验 接通支付回调与支付通知接口 return & notify 完美踩坑,记录一次心酸旅行时光码农生活

支付宝RSA2支付&转帐接口集成续集|继续拿jblog当实验田练习支付宝RSA2集成 & 网银直连 直连网银 转账到银行卡下线了

jblog集成RSA2支付宝接口经验分享 | 无坑不支付 证书最绕人 | 蚂蚁沙盒更愁人

作者:钟代麒

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

支付宝RSA2支付|小实验 接通支付回调与支付通知接口 return & notify 完美踩坑,记录一次心酸旅行时光码农生活

小实验目标

对接支付宝,实现支付、转账功能。上一次做实验已经接通了支付、转账以及相关的查询接口,但是没有接上同步通知与异步通知。今天的小实现目标就是把这2个也接通!

小实验约束

由于涉及到转账功能,所以采用了目前阿里蚂蚁金服最高级别的RSA2进行验签。

小实验参考资料

电脑网站支付 Demo

https://docs.open.alipay.com/270/106291/

那些年我们踩过的坑

神坑之一:SHA256WithRSA vs SHA1WithRSA

本次小实验的坑在于支付宝提供的rsaCertCheckV2无法正常验签,RSA2对就的是SIGN_SHA256RSA_ALGORITHMS(SHA256WithRSA),而支付宝sdk对应的rsaCertCheckV2使用的却是SIGN_ALGORITHMS(SHA1WithRSA),不明白这个坑是怎么挖出来的。通过二次组装skd提供的方法,实现了一个能正常验签的rsaCertCheckV2。

神坑之二:SignCheckContent到底是V1还是V2

按RSA2对应V2的直观感受,拿AlipaySignature.getSignCheckContentV2获取得到待签名的内容,结果签名通不过,使用AlipaySignature.getSignCheckContentV1反而通过了。

神坑之三:换java jar包

ps:有网友说要替换local_policy.jar、US_export_policy.jar,因为我之前已经换过了,所以没有踩到这个坑~

实验成果

异常通过接口(Nofity),调通,拿到可供测试的参数:

{"gmt_create":"2019-09-16 17:57:47","charset":"UTF-8","gmt_payment":"2019-09-16 17:57:51","notify_time":"2019-09-16 17:57:51","subject":"醉么商城订单Zuime1568627848379","sign":"CcQEj2Jm6vk2ECjXxsD0Dq7kJVd9c6OZb8QtSnL39GvpXf+nLpMBlsFjnkBQOfVLLX8Nl3cZ6aND47hIujgl3FB2TWJwxOoPCNpv+VSlKQJvwEE9vdycQV+iQ8CZE4ibX6yXdd4VVF+TyjrwJExYbxSvMa6VAprzEcGUkpVYOpV1BUGWuKK/7k1F6eNj6RbEDG34rBet96G7rYGLQs2f3CPpxuBrOhfzVAgNEbpX9blX+LwjMEYPhXAJpqykHUxIs953sEnwIHTKqwqUxtVHqVpYyc2qeAhK3p4FL5tjhz1Aji0CN+NNdwcBKR4uCO9j/bRHCA+aAZwkAsaTlidgmg==","buyer_id":"2088002249904873","body":"醉么商城订单Zuime1568627848379","invoice_amount":"1.00","version":"1.0","notify_id":"2019091600222175751004870502101657","fund_bill_list":"[{\"amount\":\"1.00\",\"fundChannel\":\"ALIPAYACCOUNT\"}]","notify_type":"trade_status_sync","out_trade_no":"200001568627848379","total_amount":"1.00","trade_status":"TRADE_SUCCESS","trade_no":"2019091622001404870517313294","auth_app_id":"2016052201429140","receipt_amount":"1.00","point_amount":"0.00","buyer_pay_amount":"1.00","app_id":"2016052201429140","sign_type":"RSA2","seller_id":"2088021741763089"}out_trade_no: 200001568627848379trade_no: 2019091622001404870517313294trade_status: TRADE_SUCCESS

同步通知(return),调通,验签通过,拿到 trade_no

https://i.zuime.com/order/alipay/return?charset=UTF-8&out_trade_no=200001568627848379&method=alipay.trade.page.pay.return&total_amount=1.00&sign=EUXE9Hj%2FetIMQQ5sZrxEzzM6YiDbz91a9lE7v4zjxG4iMT8o6%2Fh6UiHiHc9fA4wiIoaQ8zswJbnpDeda%2BxdK6Q97ZUBBIr5kKF%2BYd4X2%2FgWhvDSD2flwic2%2Ff0JTm0Louy%2B1H6TZ80zaV9cYi68YiQunrDgVF1EOHvE0v%2B%2F42Gs6bvA7p7V%2FN8YnjEnR0smzI2hRJoY09DDC5Yk0%2BNmLyPQgEvar1L7rR6RAlPf4f8mDHH1gU%2B3D8WCtuERT%2FscrWER06V4rteSYj5NQaQ%2F6UyZ%2Fc%2FpBwgcxB6ojVmQKi2LSqEEEt%2BYIH7SpI5QhtiK4ycl2PVK%2FpghR%2FzHjh3cGWQ%3D%3D&trade_no=2019091622001404870517313294&auth_app_id=2016052201429140&version=1.0&app_id=2016052201429140&sign_type=RSA2&seller_id=2088021741763089&timestamp=2019-09-16+17%3A58%3A02
签名通过,tradeNo 200001568627848379

完美调通支付宝RSA2接口的Demo源代码可关注公众号【Yuema约吗】,回复“alipay”获取。

核心代码片段

/**   * 修复支付宝SDK的RSA2验签Bug   * @param params   * @return   * @throws Exception   */  public boolean rsaCertCheckV2(Map<String, String> params) throws Exception{    //获取        String sign = params.get("sign");        String content = AlipaySignature.getSignCheckContentV1(params);    return AlipaySignature.rsaCertCheck(content,sign, alipayCertPath, AlipayConstants.CHARSET_UTF8,AlipayConstants.SIGN_TYPE_RSA2);  }

今天实验覆盖的是return与notify,结合上一次分享,已经覆盖了接支付宝所需的接口。想了解支付、转账相关接口实验数据与踩坑经验分享,可查看上一篇分享。

支付宝RSA2支付&转帐接口集成续集|继续拿jblog当实验田练习支付宝RSA2集成 & 网银直连 直连网银 转账到银行卡下线了

PS: 我不知道使用沙盒进行测试的小伙伴是怎么配置的,卡死在支付宝证书这块,沙盒管理界面没有下载的入口,导致无法进行RSA2的沙盒实验,现在使用的是正式帐号^_^​