支付 |
您所在的位置:网站首页 › 收款码个人账户 › 支付 |
1. 前言
很多人或者很多业务都有接入支付宝支付或者微信支付的需要,但接入第三方支付(alipay、wxpay)一直都需要公司资质或者个体户等,使得个人开发者只能望而却步。 最近了解到支付宝有一个支付能力【当面付】竟然支持个人接入,激动得我不得不写一篇博客好好介绍一下(太懒了,有大半年没有写博客了),这款支付产品可以支持实现【电脑端的web支付】和【手机端的h5支付】,简直顶到爆炸,博客下面有体验地址~ 别着急,看完这篇博客,相信你都不用看官方文档就可以完成对接,我也会提供对接的核心代码出来作为参考。(Java对接支付宝当面付) 2. 当面付产品介绍 2.1 场景描述2种场景当面付帮助商家在线下消费场景中实现快速收款,支持 【扫码支付】 和 【条码支付】 两种付款方式。商家可通过以下两种任一方式进行收款,提升收银效率,实现资金实时到账。 扫码支付:买家通过使用支付宝 扫一扫 功能,扫描商家收款二维码即可完成 扫码支付 付款。(用户扫商家的收款码) 条码支付:买家出示支付宝钱包中的条码、二维码,商家扫描用户条码即可完成 条码支付 收款。(商家扫用户的付款码)如果上面的文字不够清晰明细,那就来看下面的图片吧,简单明了 fastboot.shaines.cn/alipay/web/… 支付流程如下图b.alipay.com/signing/pro… 填写相关资料 经营类目 选择 “百货零售 / 其他零售 / 杂货店”,或者其他...问题不大 营业执照 可不上传 店铺招牌 可以拍一下身份的百货店,或者百度找一张类似的图 等待审核(工作日的话大概30分钟,非工作日就不好说了) 5. 创建应用并且添加支付能力可以参考官方文档:(或者按照我的步骤下面步骤) opendocs.alipay.com/open/200/10… 5.1 创建应用(点击链接进入)open.alipay.com/platform/de… opendocs.alipay.com/open/194/10… 6.2 引入相关依赖 gradle依赖方式 compile group: 'com.alipay.sdk', name: 'alipay-sdk-java', version: '4.10.170.ALL' 复制代码 maven依赖方式 com.alipay.sdk alipay-sdk-java 4.10.170.ALL 复制代码 6.3 当面付-预下单 /** 创建的应用ID */ @Value("${fastboot.pay.alipay.app-id}") private String appId; /** 自己生成的应用私钥 */ @Value("${fastboot.pay.alipay.private-key}") private String privateKey; /** 支付宝提供的支付宝公钥 */ @Value("${fastboot.pay.alipay.alipay-public-key}") private String alipayPublicKey; /** 回调地址,需要公网且链接不需要重定向的,如:https://fastboot.shaines.cn/api/myalipay/trade-notify */ @Value("${fastboot.pay.alipay.notify-url}") private String notifyUrl; @RequestMapping("/trade-precreate") @ApiOperation("当面付预下订单") @ResponseBody public Result tradePrecreate(AlipayTradePrecreateRequestDTO requestDTO) { AssertUtils.notEmpty(requestDTO.getSubject(), "标题不可以为空"); AssertUtils.notEmpty(requestDTO.getTotalAmount(), "金额不可以为空"); AssertUtils.check(requestDTO.getSubject().length() > 50, "标题不可以超过50字"); AssertUtils.check(requestDTO.getTotalAmount().compareTo(new BigDecimal("0")) = 0, "金额不可以超过50元"); // 金额保留两位小数 requestDTO.setTotalAmount(requestDTO.getTotalAmount().setScale(2, BigDecimal.ROUND_HALF_UP)); // 创建 AlipayClient AlipayClient alipayClient = new DefaultAlipayClient( "https://openapi.alipay.com/gateway.do", appId, privateKey, "json", "UTF-8", alipayPublicKey, "RSA2"); AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); // String outTradeNo = UUID.randomUUID().toString().replace("-", ""); String orderNo = IDUtil.generate().toString(); request.setBizContent(String.format("{\n" + " \"out_trade_no\": \"%s\", \n" + " \"total_amount\": \"%s\", \n" + " \"subject\": \"%s\", \n" + " \"store_id\": \"JM01\", \n" + " \"qr_code_timeout_express\": \"30m\"\n" + "}", orderNo, requestDTO.getTotalAmount(), requestDTO.getSubject())); request.setNotifyUrl(notifyUrl); AlipayTradePrecreateResponse response; try { response = alipayClient.execute(request); } catch (AlipayApiException e) { throw new BusinessException(String.format("下单失败 错误代码:[%s], 错误信息:[%s]", e.getErrCode(), e.getErrMsg())); } log.info("AlipayTradePrecreateResponse = {}", response.getBody()); /* { "code": "10000", "msg": "Success", "out_trade_no": "815259610498863104", "qr_code": "https://qr.alipay.com/bax09455sq1umiufbxf4503e" } */ if (!response.isSuccess()) { throw new BusinessException(String.format("下单失败 错误代码:[%s], 错误信息:[%s]", response.getCode(), response.getMsg())); } // TODO 下单记录保存入库 // // 返回结果,主要是返回 qr_code,前端根据 qr_code 进行重定向或者生成二维码引导用户支付 AlipayTradePrecreateResponseDTO responseDTO = new AlipayTradePrecreateResponseDTO(); responseDTO.setOrderNo(orderNo); responseDTO.setQrCode(response.getQrCode()); return new Result(responseDTO); } 复制代码 6.4 支付宝官方支付回调(扫码支付) @RequestMapping("/trade-notify") @ResponseBody public String tradeNotify(HttpServletRequest request) { Map parameterMap = request.getParameterMap(); Map params = new HashMap(32); parameterMap.forEach((key, val) -> params.put(key, String.join(",", val))); /* { "gmt_create": "2021-02-24 09:12:57", "charset": "UTF-8", "seller_email": "[email protected]", "subject": "测试", "sign": "XyrF+MU+zPIAVKdBGcrpgwpYYaG3uAqk7Y34LDQJ+BHXyBTfRvkq8wEm6MOz2np4GoJ1pkoV1ZzZGKdhoTHrxFAxk2hFvTXs9UoBpyrzV/kuLmC436IHWOe2koTWqTZCWhm+6w3NJWCNwq+nmUjzvLvmQWgSruBBJ/ZLR3cWGwMQleoj1clkc7smVdBKiFpY1oxc8nCOSIgKsyxZZ3Iza0rJKYResR7BRNFhmSI7sOYQyQEr0c8LPTPnyhAWVypQcAhHEkpZIyMbRjG9ayOdhtmI3VLh7Kh5AD9c1/VVT1grHrcucXhkhwBvJndQPDmXxcl/nSwhuSlMttAd9HPL2A==", "buyer_id": "2088112022569596", "invoice_amount": "0.01", "notify_id": "2021022400222091303069591445812598", "fund_bill_list": "[{\"amount\":\"0.01\",\"fundChannel\":\"ALIPAYACCOUNT\"}]", "notify_type": "trade_status_sync", "trade_status": "TRADE_SUCCESS", "receipt_amount": "0.01", "app_id": "2021002107650269", "buyer_pay_amount": "0.01", "sign_type": "RSA2", "seller_id": "2088122717972675", "gmt_payment": "2021-02-24 09:13:03", "notify_time": "2021-02-24 09:13:03", "version": "1.0", "out_trade_no": "def55f2d4076451c948eba010dfc1255", "total_amount": "0.01", "trade_no": "2021022422001469591437625740", "auth_app_id": "2021002107650269", "buyer_logon_id": "143***@qq.com", "point_amount": "0.00" } */ log.info("============>>> /trade-notifyparams:{}", JSON.toJSONString(params)); // boolean check; try { // 必须要验签 check = AlipaySignature.rsaCheckV1(params, alipayPublicKey, "UTF-8", "RSA2"); log.info("============>>> check: [{}]", check); } catch (Exception e) { log.warn("tradeNotify exception", e); return "failure"; } if (!check) { return "rsaCheckV1 = false"; } // TODO 修改下单的订单信息为已支付 // return "success"; } 复制代码 7. 结束语好了,来到这里基本完成对接了,如果还需要对接退款或者其他的业务,请浏览更多官方文档实现或者给我留言,如果本文有记录不对或者笔误,还劳烦指出修正以免误导他人,感谢! 如果本文有帮助到你,你也可以 点击链接 或者 支付宝扫一扫二维码 给我一点小反馈~ 电脑点击下方链接测试fastboot.shaines.cn/alipay/web/… 支付宝扫一扫 即可测试(或者系统浏览器扫,不要使用微信扫,因为微信浏览器会限制支付宝功能)程序员[ 后宇 ],是一个关注编程,热爱技术的Java后端开发者,热衷于 [ Java后端 ],[ 数据爬虫领域 ]。不定期分享 I T 技能和干货!!欢迎关注 "IT加载中",一个只出 干货 和 实战 的公众号。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |