支付宝手机网页支付

一.准备工作

1.首先你得开通手机网页支付,在支付宝商家中心》产品中心》支付产品》手机网站支付,然后开通支付。签约:点击“立即接入”,按要求填写并提交产品签约申请,预计一个工作日即可完成审核,这个很快我是十分钟就收到通过的邮件。
2.需要去支付宝开放平台创建一个网页/移动支付的应用。需要自己存下AppID,以及秘钥(自己生成的支付公钥和私钥,以及支付宝提供的支付公钥)。这个也需要审核,这个审核没有邮件,需要自己注意查看支付宝开放平台系统消息。

二.开发

支付宝手机网页支付的流程是这样的:
1.手机端点击提交到后台接口
2.后台组装数据,通过SDK向支付宝发起请求,返回数据直接输出到前端网页,前端会自动展现支付页面,调用支付宝APP
3.前端支付成功之后会跳转到同步通知前端,异步通知服务器接口,以异步通知接口为准。(同步地址和异步地址在发起支付的时候设置参数)。
蚂蚁技术支持提供的向导,大家可以参考一下,里面有代码示例
“手机网站支付”适用于商家在移动端网页应用中集成支付宝支付功能。用户在商家手机网站消费,通过浏览器自动跳转支付宝APP或支付宝网页完成付款。 轻松实现和APP支付相同的支付体验。

引入支付宝SDK

<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.9.28.ALL</version>
        </dependency>

后端发起支付申请代码

public void doPost(HttpServletRequest request,
                      HttpServletResponse response) throws ServletException, IOException {
        /** 支付宝网关 **/
        String URL = "https://openapi.alipay.com/gateway.do";
    
        /** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
        String APP_ID = "";
    
        /** 应用私钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602471154?ant_source=antsupport **/
        String APP_PRIVATE_KEY = "";
    
        /** 支付宝公钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602487431 **/
        String ALIPAY_PUBLIC_KEY = "";
        
        /** 初始化 **/
        AlipayClient alipayClient = new DefaultAlipayClient(URL,APP_ID,APP_PRIVATE_KEY,"json","UTF-8",ALIPAY_PUBLIC_KEY,"RSA2");
        
        /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.wap.pay(手机网站支付) **/
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();

        /** 设置业务参数  **/
        AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();

        /** 商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/
        model.setOutTradeNo("20200612000001");

        /** 销售产品码,固定值:QUICK_WAP_WAY **/
        model.setProductCode("QUICK_WAP_WAY");

        /** 订单标题 **/
        model.setSubject("订单标题");

        /** 订单金额,精确到小数点后两位 **/
        model.setTotalAmount("0.01");

        /** 订单描述 **/
        model.setBody("订单描述");

        /** 业务扩展参数 **/
        //ExtendParams extendParams = new ExtendParams();

        /** 系统商编号,填写服务商的PID,返佣参数传值前提:传值账号需要签约返佣协议,用于isv商户。 **/
        //extendParams.setSysServiceProviderId("2088511****07846");

        /** 花呗分期参数,传值前提:必须有该接口花呗收款准入条件,且需签约花呗分期 **/
        /** 指定可选期数,只支持3/6/12期,还款期数越长手续费越高 **/
        // extendParams.setHbFqNum("3");

        /** 指定花呗分期手续费承担方式,手续费可以由用户全承担(该值为0),也可以商户全承担(该值为100),但不可以共同承担,即不可取0和100外的其他值。 **/
        //extendParams.setHbFqSellerPercent("0");

        //model.setExtendParams(extendParams); 

        /** 将业务参数传至request中 **/
        alipayRequest.setBizModel(model);

        /** 注:支付结果以异步通知为准,不能以同步返回为准,因为如果实际支付成功,但因为外力因素,如断网、断电等导致页面没有跳转,则无法接收到同步通知;**/
        /** 同步通知地址,以http或者https开头,支付完成后跳转的地址,用于用户视觉感知支付已成功,传值外网可以访问的地址,如果同步未跳转可参考该文档进行确认:https://opensupport.alipay.com/support/helpcenter/193/201602474937 **/
        alipayRequest.setReturnUrl("");

        /** 异步通知地址,以http或者https开头的,商户外网可以post访问的异步地址,用于接收支付宝返回的支付结果,如果未收到该通知可参考该文档进行确认:https://opensupport.alipay.com/support/helpcenter/193/201602475759 **/
        alipayRequest.setNotifyUrl("");

        /**第三方调用(服务商模式),传值app_auth_token后,会收款至授权app_auth_token对应商家账号,如何获传值app_auth_token请参考文档:https://opensupport.alipay.com/support/helpcenter/79/201602494631 **/
        //request.putOtherTextParam("app_auth_token", "传入获取到的app_auth_token值");

        String form = null;
        try {

          /** 调用SDK生成表单form表单 **/
          form = alipayClient.pageExecute(alipayRequest).getBody();
          
          /** 调用SDK生成支付链接,可在浏览器打开链接进入支付页面 **/
          //form = alipayClient.pageExecute(alipayRequest,"GET").getBody();
          
        } catch (AlipayApiException e) {
          e.printStackTrace();
        } 

        /** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/93 **/
        System.out.println(form);
        response.setContentType("text/html;charset=" + "utf-8");

        /** 直接将完整的表单html输出到页面 **/
        response.getWriter().write(form);
        response.getWriter().flush();
}

如果你在支付的时候,发现无法支付,提示商家账户异常,请联系商家处理T1,这个问题解决方案是,让法人登录这个支付宝账号进行人脸识别就可以了;还有一种就很麻烦,需要法人手持身份证照片+改了公章的营业执照,而且呢得支付宝那边给你发邮件,在指定的网址上填写。怎么收到这个邮件呢,找客服,机器人不好使,人工客服也没有帮我解决。我是打电话给客服的,人工电话客服要等。

支付成功之后,回调。
回调地址一定得是外网可以访问的地址,我是用了内网穿透,直接访问到我本地的。我用的是哲西云,可以免费使用两个。

 public void aliNotify(HttpServletRequest request,
                          HttpServletResponse response){
        //获取支付宝POST过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map requestParams = request.getParameterMap();
        for (Object o : requestParams.keySet()) {
            String name = (String) o;
            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);
        }

        //异步验签:切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
        //boolean AlipaySignature.rsaCheckV1(Map params, String publicKey, String charset, String sign_type)
        String ALIPAY_PUBLIC_KEY = "是支付宝的公钥,不是我们生成的公钥";
        try {
            boolean flag = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, "UTF-8","RSA2");
            log.info("验签结果:"+flag);
            
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        response.setContentType("text/html;charset=" + "utf-8");
        /* 直接将完整的表单html输出到页面 **/
        try {
            response.getWriter().write("success");
            response.getWriter().flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

如果你没有记录下支付宝的秘钥,去这里查看支付宝开放平台找到你的应用,查看应用信息,里面有一个开发信息,点击“接口价签方式”后面的"设置/查看"

其实本身这个支付宝手机网页支付很简单,但是支付宝的登录管理和查看很乱,你完全不知道去哪里找这些内容,很多平台,登录平台,商户平台,开发中心,产品中心,蚂蚁技术支持,弄的有点懵,记录一下,方便以后查看

你可能感兴趣的:(第三方接入)