首先确保签约单笔转账到支付宝账号
转账到支付宝账号是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;
}