Android 平板智能点餐系统:无服务器部署与支付宝当面付集成

2024-10-29
来源:网络整理

前段时间,该公司有一个项目,要使用平板电脑构建智能订购系统。与我们常用的APP不同的是,这个项目只部署在商户终端(即平板设备)上,而且由于时间等原因,领导并不打算部署服务器。换句话说,必须全面落实。顾客点餐后,系统发起支付宝现场支付请求,并生成现场支付二维码。客户完成付款后,订单即发出。一些具体业务就不详细讨论了。

在研究平台上刷脸支付的使用时,我首先阅读了开放平台文档中心的一些文档(刷脸支付地址|Web&移动应用)。下图为扫码支付接入指南截取。我们可以看到,其实有一个模块,叫做“商户后台”。也就是说,我们需要将设备的预购请求发送到服务器,然后服务器再发送到支付宝后端。当然,这是最安全、最完美的方式。看到下图,很多人可能会问:我们是否可以绕过服务器,直接从设备向支付宝发起预购请求?答案是肯定的。这也是本文的重点。

既然你点击进入我的博客,我相信你一定有以下需求:没有服务器,只想写一个程序来实现面对面支付。另外,我相信您可能还遇到过以下问题:

1.我下载了java demo,但在电脑上无法正常运行。

然后你需要了解面对面签名、公钥、私钥的问题。

2.我导入了java demo,可以运行,但是无法生成二维码。

然后需要修改代码中二维码生成部分的文件路径。

3.我可以在中运行它,但几乎相同的代码在开发的应用程序中无法正常使用。

相信大多数人都遇到过这个问题,恭喜你,你来对地方了。

我看了官方论坛上的一些博客,也参考了蚂蚁金服Java提供的demo(下载地址网页&手机应用)。一开始我自己下载,导入使用,能正常运行流程。然而,几乎相同的 Java 代码在 .这个问题困扰了我三天。我也尝试在网上寻找答案,但仍然没有文章可以解答我的疑惑。

我们来看看我们遇到的问题: 当我们向支付宝发起预付款请求时,以为会收到支付宝的二维码信息,结果愣住了。没有生成二维码,提示“系统异常,预购状态未知!!!”。预付款请求代码如下(与Java demo几乎相同):

// 测试当面付2.0生成支付二维码 public void test_trade_precreate() { String outTradeNo = "tradeprecreate" + System.currentTimeMillis() + (long) (Math.random() * 10000000L); String subject = "xxx品牌xxx门店当面付扫码消费"; String totalAmount = "0.01"; String storeId = "test_store_id"; String timeoutExpress = "5m"; AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder() .setSubject(subject) .setTotalAmount(totalAmount) .setOutTradeNo(outTradeNo) .setStoreId(storeId) .setTimeoutExpress(timeoutExpress); AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder); switch (result.getTradeStatus()) { case SUCCESS: Log.d("TTTT", "支付宝预下单成功: )"); AlipayTradePrecreateResponse response = result.getResponse(); try { mBitmap = QrUtils.qrToBitmap(response.getQrCode(), 256); } catch (WriterException e) { e.printStackTrace(); } break; case FAILED: Log.d("TTTT", "支付宝预下单失败: )"); break; case UNKNOWN: Log.d("TTTT", "系统异常,预下单状态未知!!!"); break; default: Log.d("TTTT", "不支持的交易状态,交易返回异常!!!"); break; } }

看到这个问题,相信大家都很困惑。为什么一模一样的Java代码在中国可以作为Java程序运行,而在中国就不行呢?我们切换到下面,找到如下日志:

里面有一个链接。如果您打开此链接,您将收到签名验证错误的通知:

于是,我开始一次又一次的验证我的私钥和公钥是否输入错误。最后,我确信我绝对没有配置错误。那么为什么会报告这个问题呢?于是,我开始以百度中的log为关键字,到开发者社区查了一下,大致知道了问题的原因。 (地址)。简单来说,出于安全考虑,需要验证证书,但端点无法验证证书。也就是说,如果我们在客户端实现的话,就必须绕过安全认证。

由于项目工期比较紧,所以我没有采用自己编写网络请求的方法。因为我觉得不太靠谱。接下来,我开始研究支付宝sdk的源码。

最近,我的一个朋友遇到了一些集成问题。三四年过去了,我会重新整理一下——

这里注意:支付宝集成文档要求我们使用-sdk-java-3.3.0,其实就相当于外部提供的sdk,而-sdk-java-3.3.0-,这个可以认为是支付宝的源码sdk,而我们的修改也是基于它:

我看了源码很长时间,可能一两天,终于找到了问题所在。文件名是.java。部分源码如下。所以,我尝试将其更改为 true。编译一下,发起请求,就成功了。 。惊讶不惊讶?令人惊讶吗?困扰我们很久的问题其实只需要修改一处即可。 。 。

static { try { ctx = SSLContext.getInstance("TLS"); ctx.init(new KeyManager[0], new TrustManager[] { new DefaultTrustManager() }, new SecureRandom()); ctx.getClientSessionContext().setSessionTimeout(15); ctx.getClientSessionContext().setSessionCacheSize(1000); socketFactory = ctx.getSocketFactory(); } catch (Exception e) { } verifier = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return false;//默认认证不通过,进行证书校验。 } }; }

这里请注意,我没有研究过如何将java代码打包成jar包。我们没有使用-sdk-java-3.3.0,而是直接复制对应文件夹中的源码,放到我们自己的项目src中,并删除原来的sdk jar包。也就是说,不使用SDK,直接使用修改后的源码进行集成:

1.libs目录:删除-sdk-java-3.3.0,保留其他jar包。

2.同时,也注释掉:

3、复制sdk中整个com..api包,放到项目中

libs/-jar 视角:

复制到 src/main/java 透视图:

4.找不到类等问题。由于jar包出于安全原因删除了一些类,因此可以下载.jar并导入:

导入后,只需重新安装:

分享