在做手机app时需要接入一个比较完整的商城,自己写没时间的情况下,接入有赞商城,现在记录下来。
/**
* 有赞基本配置
* @author dxt
*/
public class YouZanConfig {
//app接入有赞的client_id和client_secret
public static String client_id="";
public static String client_secret="";
public static String kdt_id="";
public static String loginUrl="https://uic.youzan.com/sso/open/login";
public static String loginoutUrl="https://uic.youzan.com/sso/open/logout";
public static String initTokenUrl="https://uic.youzan.com/sso/open/initToken";
public static String TokenUrl="https://open.youzan.com/oauth/token";
public static String tradesUrl="https://open.youzan.com/api/oauthentry/youzan.trades.sold/3.0.0/get";
}
需要一个可以发送网络请求的方法
public class MyX509TrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
public class YouZanHttp {
/**
* 发送https请求
* @param requestUrl 请求地址
* @param requestMethod 请求方式(GET、POST)
* @param outputStr 提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//请求方式
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
// 当outputStr不为null时向输出流写数据
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 注意编码格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect();
jsonObject = new JSONObject(buffer.toString());
} catch (ConnectException ce) {
System.out.println("连接超时:{}");
} catch (Exception e) {
System.out.println("https请求异常:{}");
}
return jsonObject;
}
/**
* 获取有赞返回的json登陆消息
* @param userid
* @return
*/
public static JSONObject getYouzan(String userid){
JSONObject json=null;
String content="client_id="+YouZanConfig.client_id+"&client_secret="+YouZanConfig.client_secret+"&open_user_id="+userid;
json= YouZanHttp.httpsRequest(YouZanConfig.loginUrl, "POST", content);
return json;
}
如图是有赞的文档
https://www.youzanyun.com/docs/guide/appsdk/683?from_source=pzshouye&
在登陆过程中,需要有自己的独立账号体系作为app登陆有赞的账户系统,如果你是用在微信公众号中,则不需要有独立账号,只需要授权有赞接入到微信公众号,
如上初始化token的请求过程,下图是登陆过程,只需要传入自己的userid就可以登陆有赞商城
将上面的三个参数返回给app客户端,因为有赞的appsdk中做了缓存功能 ,上面说的token七天的有效期不需要后台来做处理,有赞的sdk在签证这几个参数失效后有自己的回调触发事件,客户端app只要根据代码实现事件回调逻辑就可以完成有赞在app中嵌入的过程。
原生安卓https://www.youzanyun.com/docs/guide/appsdk/688?from_source=pzshouye&
下面是根据接口获取有赞订单信息,放入自己的数据库,方便统计,用定时器做每天晚上获取一次,因为不是按照时间段获取,而是全部获取订单完成(签收状态),每次都是相同操作
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.ruchuapp.tools.DbUtil;
import com.ruchuapp.tools.StringUtil;
import com.youzan.open.sdk.client.auth.Token;
import com.youzan.open.sdk.client.core.DefaultYZClient;
import com.youzan.open.sdk.client.core.YZClient;
import com.youzan.open.sdk.gen.v3_0_0.api.YouzanTradesSoldGet;
import com.youzan.open.sdk.gen.v3_0_0.api.YouzanUserWeixinOpenidGet;
import com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradesSoldGetParams;
import com.youzan.open.sdk.gen.v3_0_0.model.YouzanTradesSoldGetResult;
import com.youzan.open.sdk.gen.v3_0_0.model.YouzanUserWeixinOpenidGetParams;
import com.youzan.open.sdk.gen.v3_0_0.model.YouzanUserWeixinOpenidGetResult;
/**
* 开启一个线程,用于在固定的时间段从有赞数据库获取订单记录
*/
@WebServlet("/YouZanInitServlet")
public class YouZanInitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void init() throws ServletException {
super.init();
Calendar cal=Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
Timer time=new Timer();
time.schedule(new TimerTask() {
@Override
public void run() {
//在这里做获取订单消息
JSONObject tradesInfo = getTradesInfo();
getMustMess(tradesInfo);
}
}, cal.getTimeInMillis(),24*60*60*1000);
}
/**
* 获取有赞商品订单
* 发起网络请求获取返回的订单信息
* @return
*/
private static JSONObject getTradesInfo(){
JSONObject json=null;
//"8dd8ca0de6e631e396be624e659e7b5a"
String accessToken = getAccessToken.getAccessToken();
YZClient client = new DefaultYZClient(new Token(accessToken)); //new Sign(appKey, appSecret)
// YZClient client = new DefaultYZClient(new Token("18378bf25aa7305f8436ff9c37f15965")); //new Sign(appKey, appSecret)
YouzanTradesSoldGetParams youzanTradesSoldGetParams = new YouzanTradesSoldGetParams();
// youzanTradesSoldGetParams.setPageNo(1L);
youzanTradesSoldGetParams.setType("ALL");
youzanTradesSoldGetParams.setStatus("TRADE_BUYER_SIGNED");//只查找订单完成签收的订单列表
YouzanTradesSoldGet youzanTradesSoldGet = new YouzanTradesSoldGet();
youzanTradesSoldGet.setAPIParams(youzanTradesSoldGetParams);
YouzanTradesSoldGetResult result = client.invoke(youzanTradesSoldGet);
try {
json=new JSONObject(result.toString());
} catch (Exception e) {
e.printStackTrace();
}
return json;
}
/**
* 通过手机号获取微信用户的openid
* @param tel
* @return
*/
private static String getUserOpenid(String tel){
String str="";
YZClient client = new DefaultYZClient(new Token("token")); //new Sign(appKey, appSecret)
YouzanUserWeixinOpenidGetParams youzanUserWeixinOpenidGetParams = new YouzanUserWeixinOpenidGetParams();
youzanUserWeixinOpenidGetParams.setMobile(tel);
youzanUserWeixinOpenidGetParams.setCountryCode("+86");
YouzanUserWeixinOpenidGet youzanUserWeixinOpenidGet = new YouzanUserWeixinOpenidGet();
youzanUserWeixinOpenidGet.setAPIParams(youzanUserWeixinOpenidGetParams);
YouzanUserWeixinOpenidGetResult result = client.invoke(youzanUserWeixinOpenidGet);
JSONObject json=new JSONObject(result);
// json.getString("");
boolean has = json.has("response");
if(!has){//有的情况下
str="";
}else{
try {
JSONObject jo= (JSONObject) json.get("response");
String opneid = jo.getString("open_id");
str=opneid;
} catch (JSONException e) {
e.printStackTrace();
}
}
return str;
}
/**
* 获取订单信息并进行比较,插入操作
* @param jo
*/
private void getMustMess(JSONObject jo){
try {
JSONArray ja=new JSONArray(jo.get("trades").toString());
if(ja.length()==0){
return;
}
for(int i=0;i
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import org.json.JSONException;
import org.json.JSONObject;
import com.ruchuapp.tools.CreateOnlyID;
import com.ruchuapp.tools.DbUtil;
/**
* 开启一个线程,每七天获取有赞的token一次
*/
@WebServlet("/InitYouzanTokenServlet")
public class InitYouzanTokenServlet extends HttpServlet implements Servlet {
private static final long serialVersionUID = 1L;
@Override
public void init() throws ServletException {
super.init();
try {
JSONObject youzan = getYouzan();
boolean insertAccessToken = insertAccessToken(youzan.getString("access_token"),youzan.getString("expires_in"));
if(insertAccessToken){
System.out.println("youzan七天的token生成了哦");
}else{
System.out.println("youzan七天的token有问题呢");
}
} catch (JSONException e1) {
e1.printStackTrace();
}
System.out.println("111222");
Calendar cal=Calendar.getInstance();
long timeInMillis = cal.getTimeInMillis();
Timer time=new Timer();
time.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("111222333333");
try {
JSONObject youzan = getYouzan();
boolean insertAccessToken = insertAccessToken(youzan.getString("access_token"),youzan.getString("expires_in"));
if(insertAccessToken){
System.out.println("youzan七天的token生成了哦");
}else{
System.out.println("youzan七天的token有问题呢");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}, timeInMillis, 7*24*60*60*1000);
}
/**
* 获取有赞返回的json登陆消息
* @param userid
* @return
*/
public static JSONObject getYouzan(){
String content="client_id="+YouZanConfig.client_id+"&client_secret="+YouZanConfig.client_secret+"&grant_type=silent&kdt_id="+YouZanConfig.kdt_id;
JSONObject json= YouZanHttp.httpsRequest(YouZanConfig.TokenUrl, "POST", content);
return json;
}
/**
* 将获取到的token放到数据库中
* @param accesstoken
* @param time
* @return
*/
public boolean insertAccessToken(String accesstoken,String time){
boolean flag=false;
String truncateSql = "truncate table app_youzan_accesstoken";
String sql = "insert into app_youzan_accesstoken(tid,access_token,expires_in,create_time,bz)values(?,?,?,now(),?)";
Connection conn=null;
PreparedStatement pst1=null;
PreparedStatement pst=null;
int a=0;
try{
conn = DbUtil.getConnection();
pst1 = conn.prepareStatement(truncateSql);
pst = conn.prepareStatement(sql);
String id = CreateOnlyID.getId();
// 获取当前时间插入数据库
pst.setString(1, id);
pst.setString(2, accesstoken);
pst.setString(3, time);
pst.setString(4, "");
pst1.execute();
a= pst.executeUpdate();
}
catch (SQLException e) {
e.printStackTrace();
}finally{
DbUtil.closeStatement(pst);
DbUtil.closeStatement(pst1);
DbUtil.closeConnection(conn);
}
if(a>0){
flag=true;
}
return flag;
}
}