前言
微信
、新浪
、支付宝
等平台的开放sdk是app开发中常用到的第三方库,主要实现支付、分享、登录等功能,目前已有一些平台对这些sdk进行了很好的封装。例如友盟
的社会化组件。但是在使用第三方封装的库时总会遇到一些问题,例如:参数配置复杂,包太大等问题。于是我抽取这三个常用的平台sdk
包做了一个简单的封装,旨在提供原始SDK
功能,和最简化的配置即可使用这些SDk
L-Platform功能介绍
支付
1.支付宝支付
: 包含本地生成订单发起支付,以及使用服务器生成好的订单发起支付两种模式
2.微信支付
:包含本地请求生成预支付订单
请求再发起支付,以及服务端请求生成预支付订单信息返回后发起支付
分享
-
普通分享
: 包括分享到微信好友
、微信朋友圈
、qq好友
、qq空间
、新浪微博
-
小程序分享
: 包括分享小程序小卡片
给好友,直接打开微信小程序
-
微信朋友圈多图分享
:该功能会直接打开微信朋友圈的编辑界面,让你像平时发朋友圈那样发。
登录
-
微信登录
: 打开微信授权界面登录 -
qq登录
: 打开qq授权界面登录
导入配置
app-> build.gradle
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [appid: applicationId]
}
}
}
}
dependencies {
...
implementation 'com.lu.lib:lplatform:1.0.2'
annotationProcessor 'com.lu.lib:lplatform-processor:1.0'
}
AndroidManifest.xml
将上述配置导入项目中即可开始使用,在项目源码的demo里也有详细的使用方式
配置各个平台参数
//下面的初始化配置为各自平台的信息
//第一个参数都是appid,第二个参数是app_secret,第三个参数是新浪需求的redirect_url
//如果不需要调用某个平台的sdk,不配置参数即可
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//下面的初始化配置为各自平台的信息
PlatformConfigurator.getInstance()
.isDebug(BuildConfig.DEBUG)
.withContext(this)
.setSINAConfig("", "", "")
.setQQConfig("", "")
.setMiniProgramConfig("")
.setWXConfig("", "")
.initialize();
}
}
支付
通常支付仅对微信和支付宝进行开发
支付代码示例
public class PayDemoActivity extends AppCompatActivity implements PayObserver {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pay_demo);
//注册用于监听支付的回调
PayObservable.getInstance().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
PayObservable.getInstance().unRegister(this);
}
/**
* 在本地对支付的一些参数进行处理生成orderInfo
*
* @param v
*/
public void localAliPay(View v) {
//业务数据的包装类 参数含义查看该BizContent类
BizContent bizContent = new BizContent();
bizContent.setTotal_amount("");
bizContent.setProduct_code("");
bizContent.setTimeout_express("");
bizContent.setBody("");
bizContent.setSubject("");
bizContent.setOut_trade_no("");
new AliPayUtil.Builder(this)
.setAPPID("")
.setRSA_PRIVATE("")
.setBiz_content(bizContent)
.setNotify_url("")
.build()
.pay();
}
/**
* 支付宝支付真正发起请求时只需要一个经过加密的订单信息字符串orderInfo,这个字符串可以由服务器生成,也可以在本地生成
*
* @param v
*/
public void remoteAliPay(View v) {
//这个orderInfo应该由服务器生成好返回到客户端,这里只写作伪代码。
final String orderInfo = "";
//客户端直接传入orderInfo字符串到支付宝sdk发起请求
new AliPayUtil.Builder(this)
.setOrderInfo(orderInfo)
.build()
.pay();
}
/**
* 由本地完成预支付订单和支付两个步骤
*
* @param v
*/
public void localWeiXinPay(View v) {
//参数细节查看WXPrePayUtil.Builder类
new WXPrePayUtil.Builder()
.setContext(this)
.setApp_secret("secret")//微信商户后台可以拿到的私钥
.setAppid("appid")
.setBody("body")
.setMch_id("")
.setNotify_url("")
.setOut_trade_no("")
.setTotal_fee("")
.setSpbill_create_ip("")
.build()
.startPrePay();
}
/**
* 如果由服务器发起预支付生成订单 那么下列的参数应该由服务器返回到客户端,客户端发起支付
*
* @param v
*/
public void remoteWeiXinPay(View v) {
new WXPayUtil.Builder()
.setContext(this)
.setAppid("appid")//appid
.setNoncestr("noncestr")//随机字符串
.setPartnerid("partnerid")//商户id
.setPrepayid("prepayid")//预支付订单号
.setSign("sign")//服务器对参数按照微信要求的形式加密后返回的验签
.setTimestamp("timestamp")//时间戳
.setPackageValue("Sign=WXPay")//固定值"Sign=WXPay"
.build()
.pay();
}
@Override
public void onPaySuccess(String payType, String resultMessage) {
//支付成功
if (payType.equalsIgnoreCase(Constants.ALI)) {
//支付宝支付成功
} else if (payType.equalsIgnoreCase(Constants.WEIXIN)) {
//微信支付成功
}
}
@Override
public void onPayFailed(String payType, String errorMessage) {
//支付失败
}
}
示例代码中分别展示了四种支付流程的使用,通常一种支付方式只会使用其中的一种,要么在本地生成订单信息,要么在服务器生成订单信息。
分享
分享的弹窗我已写好,分享的按钮会根据配置的平台信息自动添加
/**
* 普通分享 目前仅支持 微信,qq,微博3种分享
*
* @param v
*/
public void normalShare(View v) {
ShareParams params = new ShareParams.Builder()
.setTitle("测试")
.setText("测试内容")
.setUrl("http://www.baidu.com")
.setSimpleImage("http://p83nf214c.bkt.clouddn.com/1525416286.jpg")
.build();
ShareUtil.doShare(this, params);
}
/**
* 分享小程序卡片
*
* @param v
*/
public void shareMiniProgram(View v) {
ShareParams params = new ShareParams.Builder()
.setTitle("测试")
.setText("测试内容")
.setUrl("http://www.baidu.com")
.setPagePath("pages/index")
.setSimpleImage("http://p83nf214c.bkt.clouddn.com/1525416286.jpg")
.build();
ShareUtil.shareMiniProgram(params);
}
/**
* 打开小程序
*
* @param v
*/
public void openMiniProgram(View v) {
//path填写要打开的小程序页面
ShareUtil.openMiniProgram("pages/index");
}
详细的代码和注释
ShareDemoActivity
中,包括回调监听等,这里就不贴出代码
登录
登录的界面弹窗类似分享,我也已经写好了
//执行登录只需要调用这句代码即可
//首次登录只需要new 一个LoginObj即可,在第一次登录成功后获取到了openid等信息,下一次登录即可设置这些信息,sdk内部会判断这些信息的有效性,如果有效则返回成功并更新信息,不会调起授权界面
LoginObj loginObj = new LoginObj();
LoginUtil.doLogin(this,loginObj);
//成功的回调,登录成功后会返回一个LoginObj 这个对象包含了openid,access_token等信息,拿到这些信息后应该做持久化处理,再下一次登录时携带这些信息
@Override
public void loginSuccess(String platformType, LoginObj obj) {
this.loginObj = obj;
//获取到这些值之后需要保存起来,建议上传到服务器
}
总结
这个库的配置是非常简单的,对于令人头疼的微信支付回调包名限制问题,通过注解处理器自动生成的方式成功的解决了。这里介绍的使用方法如果不懂,可以前往观看demo,代码也是非常简洁而且都做了注释。