支付宝在线支付-android java 集成 2019.3.30

支付宝在线支付-android java 集成2019.3.30

Java端

首先 maven引入 我用的是最新的3.7.4.ALL 现在的最新Sdk都是ALL

		<dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>3.7.4.ALL</version>
        </dependency>

创建一个AlipayConfig.Class类
按照提示加入需要的信息 回调地址可用natapp

/**
     * 正式环境请求地址
     */
    public static final String ALIPAY_URL = "https://openapi.alipay.com/gateway.do";
    /**
     * 支付宝分配给开发者的应用ID
     *
     */
    public static final String APP_ID = "2019************";
    /**
     * 仅支持JSON
     */
    public static String FORMAT = "JSON";
    /**
     * 请求使用的编码格式
     */
    public static String CHARSET = "utf-8";
    /**
     * 商户生成签名字符串所使用的签名算法类型
     */
    public static String SIGN_TYPE = "RSA2";
    /**
     * 支付宝公钥
     */
    public static final String ALIPAY_PUBLIC_KEY = "";
    /**
     * 商户私钥
     */
    public static final String PRIVATE_KEY = "";

    /**
     * 回调地址
     */
    public static final String  CALLBACK_URL = "";

用的是ssm 所以在Collection中 我有一个方法makeOrder 需要方法抛出异常throws AlipayApiException

具体参数查看蚂蚁金服开放平台中的开发文档

public WebResult<String> makeOrder() throws AlipayApiException {
        WebResult<String> webResult = new WebResult<>();
        
        // 实例化客户端
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.ALIPAY_URL, AlipayConfig.APP_ID, AlipayConfig.PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGN_TYPE);
        // 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        // SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel()
        
        model.setBody("");
        
        model.setOutTradeNo(商户唯一订单号);  
        model.setTotalAmount(价格);
        model.setSubject("标题");
        model.setTimeoutExpress("30m"); 过期时间
        model.setProductCode("QUICK_MSECURITY_PAY");
        request.setBizModel(model);
        request.setNotifyUrl(AlipayConfig.CALLBACK_URL);//异步回调url
        // 这里和普通的接口调用不同,使用的是sdkExecute
        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
        webResult.setSuccess(true);
        webResult.setData(response.getBody());
        return webResult;
    }

将拼接好的数据返回给前端或者android端。


支付完毕后 支付宝异步回调处理 在这里判断订单状态,执行相关业务逻辑。

 @RequestMapping(value = "/getAlipayNotify", produces = "application/json;charset=UTF-8", method = {RequestMethod.GET, RequestMethod.POST })
    public void getAlipayNotify(HttpServletRequest request) {
        Map<String, String> params = new HashMap<String, String>();
        Map requestParams = request.getParameterMap();
        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);
        }
        // 切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
        try {
            boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
                    AlipayConfig.SIGN_TYPE);
            if (flag) {
                String trade_status = params.get("trade_status");
                //TRADE_SUCCESS 交易成功 支付成功
                //TRADE_CLOSED 未付款交易超时关闭,或支付完成后全额退款 交易关闭
                //TRADE_FINISHED 交易结束,不可退款  交易完成
                //WAIT_BUYER_PAY 交易创建,等待买家付款 交易创建
                if ("TRADE_SUCCESS".equals(trade_status)){
                    //TODO 交易支付成功的执行相关业务逻辑
                    String realPay=params.get("total_amount");
                    String alipayId=params.get("trade_no");
                    String timestamp=params.get("timestamp");
                    String orderId=params.get("out_trade_no");
                
                } else if ("TRADE_CLOSED".equals(trade_status)) {
                    //TODO 未付款交易超时关闭,或支付完成后全额退款,执行相关业务逻辑
                    System.out.println("Alipay:"+trade_status);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

android端

首先获取请求参数

  try {
                                               myOkHttp
                                                        .get()
                                                        .url(HttpUtil.HOST_ADDRESS+"/Alipay/makeOrder?orderid="+order.get("id").toString()+"&title="+servicetitle)
                                                        .tag(this)
                                                        .enqueue(new JsonResponseHandler() {
                                                            @Override
                                                            public void onSuccess(int statusCode, JSONObject response) {
                                                                try {
                                                                    orderInfo = response.getString("data");
                                                                } catch (JSONException e) {
                                                                    e.printStackTrace();
                                                                }
                                                            }
                                                            @Override
                                                            public void onFailure(int statusCode, String error_msg) {
                                                            }
                                                        });
                                            } catch (JSONException e) {
                                                e.printStackTrace();
                                            }

之后

									     Runnable payRunnable = new Runnable() {

                                                @Override
                                                public void run() {
                                                    PayTask alipay = new PayTask(getActivity());
                                                    Map<String,String> result = alipay.payV2(orderInfo,true);
                                                }
                                            };
                                            // 必须异步调用
                                            Thread payThread = new Thread(payRunnable);
                                            payThread.start();

android 也需要引入相关sdk
在project下 找到libs文件夹 将下载的sdk添加进去
在这里插入图片描述

主要用于记录,可能大家会看的很难受,因为我是怕我自己忘记才写下来的。 哪里有问题请评论。

猜你喜欢

转载自blog.csdn.net/qq_35562291/article/details/88908722
今日推荐