支付相关(二):APP支付宝支付-转账到支付宝账号(JAVA服务端开发)

首先确保签约单笔转账到支付宝账号

转账到支付宝账号是APP这边一个提现的功能。支付宝提供了可以转账到支付宝账号的功能,可选择收款方账户类型。可取值:

1、ALIPAY_USERID:支付宝账号对应的支付宝唯一用户号。以2088开头的16位纯数字组成。2、ALIPAY_LOGONID:支付宝登录号,支持邮箱和手机号格式。

a、转到支付宝唯一用户号,获取1ALIPAY_USERID的方式需要,支付宝授权才能拿到,下面会有代码实现

b、转账到支付宝登录号,APP可以选择让用户自己填邮箱和手机号

我是用的a方式,b方式具体参照payee_type参数介绍,单笔转账到支付宝账号

代码如下 :

支付宝授权:

  /**
    * 组装支付宝授权登录信息

    */
    @GetMapping("aliInfoStr")
    public ResultModel getAliInfoStr(HttpServletRequest request, HttpServletResponse response){
        ResultModel resultModel= new ResultModel();
        String targetId = String.valueOf(UUID.next());
        String signstr="";
        String signs = "apiname=" + AliPayConfig.AUTH_API_NAME +
                "&method=" + AliPayConfig.AUTH_API_METHOD +
                "&app_id=" + AliPayConfig.APP_ID_USER +
                "&app_name=" + AliPayConfig.AUTH_APP_NAME +
                "&biz_type=" + AliPayConfig.AUTH_BIZ_TYPE +
                "&pid=" + AliPayConfig.AUTH_PID +
                "&product_id=" + AliPayConfig.AUTH_PRODUCT_ID +
                "&scope=" + AliPayConfig.AUTH_SCOPE +
                "&target_id=" + targetId +
                "&auth_type=" + AliPayConfig.AUTH_TYPE +
                "&sign_type=" + AliPayConfig.SIGN_TYPE ;
        try {
             signstr = AlipaySignature.rsaSign(signs,AliPayConfig.PRIVATE_KEY,AliPayConfig.CHARSET,AliPayConfig.SIGN_TYPE);
            signstr=signs+"&sign="+signstr;
            resultModel.setStatus(0);
            resultModel.setMessage("支付宝授权串组装成功");
            resultModel.setResultObject(signstr);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return  resultModel;
    }

组装返给APP,支付宝调能成功调起授权,把auth_code给服务端去获取用户信息

 /**
    *  获取acesstoken 获取用户信息
    */
    @PostMapping("getAccessToken")
    public ResultModel getAccessToken(@RequestBody OrderDto dto, HttpServletRequest request,
                              HttpServletResponse response) throws AlipayApiException {
        ResultModel resultModel  = new ResultModel();
        AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.URL, AliPayConfig.APP_ID_USER, AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT, AliPayConfig.CHARSET,AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);
        AlipaySystemOauthTokenRequest aliRequest = new AlipaySystemOauthTokenRequest();
        aliRequest.setGrantType("authorization_code");
        aliRequest.setCode(dto.getAliAuthCode());
        AlipaySystemOauthTokenResponse aliResponse = alipayClient.execute(aliRequest);
        String authTokenData = aliResponse.getBody();
        JSONObject authTokenJsonObject = JSONObject.parseObject(authTokenData).getJSONObject("alipay_system_oauth_token_response");
        if(aliResponse.isSuccess()){
                System.out.println("调用成功");
                 System.out.println("调用成功");
            //以下注释是拿到token后获取用户的全部信息,因为我只需要user_id ,没有再调用    ,app支持第三方登录时候可以放开使用 
          //String accessToken=authTokenJsonObject.getString("access_token");
           // AlipayUserInfoShareRequest userInfoRequest = new AlipayUserInfoShareRequest();
           // AlipayUserInfoShareResponse userInfoResponse = alipayClient.execute(userInfoRequest,accessToken);
           // String userInfoData = aliResponse.getBody();
          //  JSONObject userInfoJsonObject = JSONObject.parseObject(userInfoData).getJSONObject("alipay_user_info_share_response");
         //   if(userInfoResponse.isSuccess()){
         //       System.out.println("调用成功");
         //       String userAliId =  userInfoJsonObject.getString("user_id");

         //   } else {
         //       System.out.println("调用失败");
          //  }
                 String userAliId =  authTokenJsonObject.getString("user_id");
                int k = iMicroInquiryUserService.updateUserAliId(userAliId,dto.getUserId()); //此处就是更新一下user里aliOpenId字段,自己写吧,不贴了
                if(k>0){
                    resultModel.setStatus(1);
                    resultModel.setMessage("绑定用户支付宝ID成功");
                }else{
                    resultModel.setStatus(0);
                    resultModel.setMessage("绑定支付宝ID失败");
                }
            } else {
                resultModel.setStatus(0);
                resultModel.setMessage("绑定支付宝授权失败");
            }

        return resultModel;
    }

用到的dto


import java.io.Serializable;


/**
* @Description:    提现表用dto

*/
public class TixianDto implements Serializable {
    private static final long serialVersionUID = -27273789824211424L;
    private Integer userId;   //用户ID
    private String userName;//用户名称
    private Integer userAliId;//阿里用户ID
    private String wxOpenId; //微信openId
    private Integer orderNo; // 商户订单号,适配每个渠道对此参数的要求,必须在商户系统内唯一
    private Float amount; // 订单总金额(必须大于0),单位为对应币种的最小货币单位,人民币为分
    private String description; // 转账备注(支持200个英文/100个汉字)。当付款方为企业账户,且转账金额达到(大于等于)50000元,remark不能为空。收款方可见,会展示在收款用户的收支详情中。
    private Integer tixianType;//提现方式  1支付宝2微信3银行卡
    private String orderWalletId;//提现订单ID
    public Float getAmount() {
        return amount;
    }

    public void setAmount(Float amount) {
        this.amount = amount;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public Integer getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(Integer orderNo) {
        this.orderNo = orderNo;
    }

    public Integer getUserAliId() {
        return userAliId;
    }

    public void setUserAliId(Integer userAliId) {
        this.userAliId = userAliId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getTixianType() {
        return tixianType;
    }

    public void setTixianType(Integer tixianType) {
        this.tixianType = tixianType;
    }

    public String getWxOpenId() {
        return wxOpenId;
    }

    public void setWxOpenId(String wxOpenId) {
        this.wxOpenId = wxOpenId;
    }

    public String getOrderWalletId() {
        return orderWalletId;
    }

    public void setOrderWalletId(String orderWalletId) {
        this.orderWalletId = orderWalletId;
    }
}

下面是转账到支付宝账号

    /**
     *  支付宝向发起提现的用户支付 

     */
    @PostMapping("payTixian")
    public ResultModel payUserAccountTixian(@RequestBody TixianDto dto, HttpServletRequest request,
                                       HttpServletResponse response) throws AlipayApiException {
        ResultModel resultModel = new ResultModel();

                    AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.URL, AliPayConfig.APP_ID_USER, AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);
                    AlipayFundTransToaccountTransferRequest tixianRequest = new AlipayFundTransToaccountTransferRequest();
                    //订单号out_biz_no ,参考app支付订单一样的 
                 String outBizNo = String.valueOf(UUID.next());
                // User user = 这一块自己实现吧,取用户的aliOpenId
                 tixianRequest.setBizContent("{" +
                            "'out_biz_no':'" + outBizNo  + "'," +
                            "'payee_type':'ALIPAY_USERID'," +//ALIPAY_LOGONID 使用看文档
                            "'payee_account':'" + user.getAliOpenId() + "'," + //这个aliOpenId就是上面授权得到那个,根据userId查出来赋值
                            "'amount':'0.1'," +
                            "'remark':'审核通过,平台已转账到支付宝账户'}");
                    AlipayFundTransToaccountTransferResponse tixianesponse = alipayClient.execute(tixianRequest);
                    String data = tixianesponse.getBody();
                    JSONObject jsonObject = JSONObject.parseObject(data).getJSONObject("alipay_fund_trans_toaccount_transfer_response");

                    if (tixianesponse.isSuccess()) {
                        System.out.println("调用成功");
                        String outBizNo =  jsonObject.getString("out_biz_no");
                        String orderId =  jsonObject.getString("order_id");
                        String payDate = jsonObject.getString("pay_date");
                        Date payTime = DateUtil.stringToDate(payDate,Constant.FORMAT);
                        AlipayFundTransOrderQueryRequest queryRequest = new AlipayFundTransOrderQueryRequest();
                        queryRequest.setBizContent("{" +
                                "'out_biz_no':'" + outBizNo + "'," +
                                "'order_id':'"+orderId+"'," +
                                "  }");
                        AlipayFundTransOrderQueryResponse queryResponse = alipayClient.execute(queryRequest);
                        String querydata = queryResponse.getBody();
                        JSONObject queryJsonObject = JSONObject.parseObject(querydata).getJSONObject("alipay_fund_trans_order_query_response");
                        if(queryResponse.isSuccess()){
                            System.out.println("调用成功");
                            //上面提现成功后我又调用了查询订单信息,根据业务需求来吧。更新账户金额和生成提现历史明细
                             
                        } else {
                            System.out.println("调用失败");
                        }

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

                
            
        }
        }
    return resultModel;
    }



你可能感兴趣的:(支付开发,JAVA,支付宝,APP)