[Java] 服务端实现 支付宝/微信 登录/支付/转账

2022-11-13  本文已影响0人  巨馍蘸酱

吐槽一下, 简书内容没有自带目录, 且中间内容区域太窄

集成

支付宝

<!-- 支付宝 -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.34.47.ALL</version>
</dependency>
alipay: # 支付宝配置
  appid: 123
  ...

微信支付

微信登录/分享社交类 和 微信支付是分开的

微信支付 所有示例都在 https://github.com/wechatpay-apiv3/wechatpay-java/blob/main/service/src/example, 请自由查看

SDK https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtml

<!-- 微信 https://github.com/wechatpay-apiv3/wechatpay-java -->
<dependency>
  <groupId>com.github.wechatpay-apiv3</groupId>
  <artifactId>wechatpay-java</artifactId>
  <version>0.2.1</version>
</dependency>
wechatpay: # 微信支付配置
  appid: 123
  ...

登录

支付宝

目前广泛应用于支付宝用户在合作商家端的快速登录场景和支付宝开放业务的免登录使用场景等。[1]

先获取 token, 再获取用户信息

  1. alipay.system.oauth.token(换取授权访问令牌) https://opendocs.alipay.com/open/02ailc?ref=api
  2. alipay.user.info.share(支付宝会员授权信息查询接口) https://opendocs.alipay.com/open/02aild?ref=api

微信

移动应用微信登录开发指南 https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html

支付

支付宝

外部商户APP唤起快捷SDK创建订单并支付[2]

alipay.trade.app.pay(app支付接口2.0) https://opendocs.alipay.com/open/02e7gq?ref=api&scene=20

微信

商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后再按Native、JSAPI、APP等不同场景生成交易串调起支付。

APP下单API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_1.shtml

转账

支付宝

转账到支付宝账户是为了满足支付宝商家向其他支付宝账户进行单笔转账的需求,针对具备开发能力的商家,提供通过 API 接口完成单笔转账的功能。商家只需输入另一个正确的支付宝账号,即可将资金从本企业支付宝账户转账至另一个支付宝账户。 该产品适用行业较广,可用于商家间的货款结算、转账汇款,商家给企业或个人发放佣金等。[3]

支付宝提供的站内转账功能,需要商家登录支付宝网站进行操作。部分拥有自身业务系统(如 CRM、ERP 等)的商家,希望支付宝提供转账接口,与自身业务系统直接对接实现转账功能,而不是频繁登录支付宝网站转账。为解决上述问题,支付宝为具备开发能力的商家提供了转账到支付宝账户产品,满足了商家通过接口集成,由商家自身业务系统完成支付宝转账功能的需求。[3]

alipay.fund.trans.uni.transfer(单笔转账接口) https://opendocs.alipay.com/open/02byuo

    public void transfer(String payeeIdentity, String payeeInfoIdentityType, String payeeName,
                         String outBizNo, String transAmount,
                         String orderTitle, String remark) throws AlipayApiException {

        CertAlipayRequest alipayConfig = new CertAlipayRequest();
        alipayConfig.setPrivateKey(privateKey);
        alipayConfig.setServerUrl(serverUrl);
        alipayConfig.setAppId(appId);
        alipayConfig.setFormat(format);
        alipayConfig.setCharset(charset);
        alipayConfig.setSignType(signType);
        alipayConfig.setCertPath(certPath);
        alipayConfig.setAlipayPublicCertPath(alipayPublicCertPath);
        alipayConfig.setRootCertPath(rootCertPath);

        Participant payeeInfo = new Participant();
        payeeInfo.setIdentity(payeeIdentity);
        payeeInfo.setIdentityType(payeeInfoIdentityType);
        payeeInfo.setName(payeeName);

        AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
        model.setPayeeInfo(payeeInfo);
        model.setOutBizNo(outBizNo);
        model.setTransAmount(transAmount);
        model.setProductCode(productCode);
        model.setBizScene(bizScene);
        model.setOrderTitle(orderTitle);
        model.setRemark(remark);
        model.setBusinessParams(businessParams);

        AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
        request.setBizModel(model);

        AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
        AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);

        if (response.isSuccess()) {
            System.out.println("调用成功");
            String responseOutBizNo = response.getOutBizNo();
            String responseOrderId =  response.getOrderId();
            String responsePayFundOrderId = response.getPayFundOrderId();
            String responseTransDate =  response.getTransDate();

        } else {
            System.out.println("调用失败");
        }
    }

微信

商户可以通过该接口同时向多个用户微信零钱进行转账操作。

发起商家转账API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_1.shtml

异步通知

支付宝

异步通知说明 https://opendocs.alipay.com/open/204/105301

    @ApiOperation("支付宝异步通知")
    @PostMapping("/alipay_async")
    public String alipay_async(HttpServletRequest request) {
        Map requestParams = request.getParameterMap();

        //获取支付宝POST过来反馈信息,将异步通知中收到的待验证所有参数都存放到map中
        Map<String, String> params = new HashMap<>();
        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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }

        try {
            //调用SDK验证签名
            //公钥验签示例代码
            boolean signVerified = AlipaySignature.rsaCheckV1(params, "ALIPAY_PUBLIC_KEY", "CHARSET", "sign_type");
            //公钥证书验签示例代码
            //boolean flag = AlipaySignature.rsaCertCheckV1(params,alipayPublicCertPath,"UTF-8","RSA2");
            if (signVerified) {
                // TODO 验签成功后
                //按照支付结果异步通知中的描述,对支付结果中的业务内容进行1\2\3\4二次校验,校验成功后在response中返回success
            } else {
                // TODO 验签失败则记录异常日志,并在response中返回fail.
                return "fail";
            }
        } catch (AlipayApiException e) {
            //throw new RuntimeException(e);
            return "fail";
        }
        return "success";
    }

微信

微信支付通过支付通知接口将用户支付成功消息通知给商户

支付通知API https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_5.shtml


  1. https://opendocs.alipay.com/open/218/105329

  2. https://opendocs.alipay.com/open/02e7gq?scene=common

  3. https://opendocs.alipay.com/open/309/106235?ref=api

上一篇 下一篇

猜你喜欢

热点阅读