版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/github_38924695/article/details/81391406
业务中用到了绑定支付宝账户的功能,需要移动端唤起支付宝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;
}
}
需要强调的是,该接口测试需要在沙箱或者是线上服务器环境测试。