JAVA通过auth_code获取支付宝账户信息

业务中用到了绑定支付宝账户的功能,需要移动端唤起支付宝app获取到auth_code后传递给后台,后台将用户支付宝的头像,昵称,user_id存入数据库,以便后面做退款转账业务。
首先需要在支付宝平台上签约授权然后下载对应jar包,这个按照官网文档做就可以。(https://docs.alipay.com/mini/introduce/auth
配置文件中的内容:

#支付宝网关(固定)
URL=https://openapi.alipay.com/gateway.do
#APPID即创建应用后生成
APP_ID= 
#开发者应用私钥,由开发者自己生成
APP_PRIVATE_KEY=
#参数返回格式,只支持json
FORMAT=json
#请求和签名使用的字符编码格式,支持GBK和UTF-8
CHARSET=UTF-8
#支付宝公钥,由支付宝生成
ALIPAY_PUBLIC_KEY=
#商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
SIGN_TYPE=RSA2

在配置文件中引入该properties,然后新建类将参数注入。
applicationContext.xml代码:

<bean id="alipayclient" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <array>
                <value>classpath*:alipayclient.properties</value>
            </array>
        </property>
    </bean>

接口代码:

@Action("getAccessTokenAndUserId")
public class OutCommonAction extends OutInterfaceBasicAction<DoctorAccount>{
    private static final long serialVersionUID = 1L;
    private Map<String, Object> msg = new HashMap<String, Object>();
    @Value("#{alipayclient[URL]}") 
    public String URL;
    @Value("#{alipayclient[APP_ID]}") 
    public String APP_ID;
    @Value("#{alipayclient[APP_PRIVATE_KEY]}") 
    public String APP_PRIVATE_KEY;
    @Value("#{alipayclient[FORMAT]}") 
    public String FORMAT;
    @Value("#{alipayclient[CHARSET]}") 
    public String CHARSET;
    @Value("#{alipayclient[ALIPAY_PUBLIC_KEY]}") 
    public String ALIPAY_PUBLIC_KEY;
    @Value("#{alipayclient[SIGN_TYPE]}") 
    public String SIGN_TYPE;

    /**
     * 支付宝验证
     *  --使用auth_code获取access_token与user_id
     * @author XiongXiaobo
     */
    @Action("getAccessTokenAndUserId")
    public String getAccessTokenAndUserId() {
        //获取参数
        String auth_code = getRequest().getParameter("auth_code");
        //校验参数
        if (StringUtils.isNotBlank(auth_code)) {
            try {
                AlipayClient alipayClient = new DefaultAlipayClient(URL,APP_ID,APP_PRIVATE_KEY,FORMAT,CHARSET,ALIPAY_PUBLIC_KEY,SIGN_TYPE);
                //使用auth_code获取access_token与user_id
                AlipaySystemOauthTokenRequest requests = new AlipaySystemOauthTokenRequest();
                requests.setCode(auth_code);
                requests.setGrantType("authorization_code");
                AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(requests);
                if(oauthTokenResponse.isSuccess()){
                     AlipayUserInfoShareRequest requestUser = new AlipayUserInfoShareRequest();
                        AlipayUserInfoShareResponse userinfoShareResponse = alipayClient.execute(requestUser, oauthTokenResponse.getAccessToken());
                        if(userinfoShareResponse!=null){
                          String  avatar=userinfoShareResponse.getAvatar();//用户头像
                          String  userName=userinfoShareResponse.getNickName();//用户昵称
                          String userId= userinfoShareResponse.getUserId();
                          //绑定医生和支付宝数据
                          msg.put("aliNickName",userName);
                          msg.put("aliAvatar",avatar);
                          msg.put("aliAccount",userId);
                          msg.put("stateCode", MsgCode.SUCCESS);
                          msg.put("message", "请求成功并返回数据!");
                          Struts2Utils.renderJson(msg);
                          return NONE;
                    }
                }
                msg.put("message", "调用失败!");
                msg.put("stateCode", MsgCode.SUCCESS);
                msg.put("message", "请求成功并返回数据!");
            } catch (Exception e) {
                msg.put("stateCode", MsgCode.SYS_ERROR);
                msg.put("message", "后台异常!");
                e.printStackTrace();
            }
        } else {
            msg.put("stateCode",MsgCode.GET_PARAM_ERROR);
            msg.put("message","有一个或多个参数为空");
        }
        Struts2Utils.renderJson(msg);
        return NONE;
    }

}

需要强调的是,该接口测试需要在沙箱或者是线上服务器环境测试。

### Java集成支付宝API获取用户信息 #### 准备工作 为了通过Java程序调用支付宝API并获得用户的OpenID和其他相关信息开发者需先完成一系列准备工作。这包括但不限于注册成为支付宝开放平台的开发者账号、创建应用以取得`app_id`以及其他必要的密钥材料[^1]。 #### 配置环境 确保已下载官方提供的最新版SDK,并将其正确引入至项目工程内;同时按照指引设置好相应的依赖项和服务端口等基本信息[^2]。 #### 编码实践 下面给出一段用于请求用户授权并通过授权码换取用户详情(含OpenID)的简化版本代码片段: ```java import com.alipay.api.AlipayApiException; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.*; import com.alipay.api.response.*; public class AlipayUserInfo { private static final String SERVER_URL = "https://openapi.alipay.com/gateway.do"; private static final String APP_ID = "your_app_id_here"; // 替换成自己的App ID private static final String PRIVATE_KEY = "your_private_key_here";// 私钥路径或内容 private static final String FORMAT = "json"; private static final String CHARSET = "UTF-8"; private static final String SIGN_TYPE = "RSA2"; /** * 使用默认客户端实例化方法构建DefaultAlipayClient对象, */ DefaultAlipayClient client = new DefaultAlipayClient(SERVER_URL, APP_ID, PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); /** * 创建一个针对OAuth 2.0协议下的Token交换请求。 */ AlipaySystemOauthTokenRequest tokenReq = new AlipaySystemOauthTokenRequest(); tokenReq.setCode(authCode); // 授权码,在前端页面重定向回调时由URL参数传递而来 try { /** 执行Token交换操作 **/ AlipaySystemOauthTokenResponse oauthResp = client.execute(tokenReq); if (oauthResp.isSuccess()) { System.out.println("access_token:" + oauthResp.getAccessToken()); /** 利用刚刚得到的accessToken发起对用户资料读取的操作 **/ AlipayUserGetRequest userReq = new AlipayUserGetRequest(); AlipayUserGetResponse userResp = client.execute(userReq, oauthResp.getAccessToken()); if (userResp.isSuccess()){ System.out.println("userId(即OpenID):" + userResp.getUserId()); // 可继续处理其他返回的数据... } else{ System.err.println("Failed to get user info."); } }else{ System.err.println("Failed to exchange auth code for access token."); } } catch (AlipayApiException e){ e.printStackTrace(); } } ``` 此段代码展示了如何利用官方提供的SDK库函数来执行OAuth认证过程中的两个主要环节——首先是基于临时授权码向服务器申请长期有效的访问令牌(`access_token`);其次是凭借该令牌查询指定账户的具体属性值,其中就包含了独一无二的身份标识符OpenID。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值