前言:
紧接着上一篇的微信支付,本篇是集成支付宝支付,相对于微信支付,支付宝的集成就简单了很多。话不多说,我们来看看怎么简单集成支付宝支付。
1.看文档:
我们先要去蚂蚁金服开放平台进行申请,这个需要公司的相关信息,目前个人是不支持的。
信息的填写就不介绍了,这个也不是我们所关心的,同时,支付宝更多的是服务器端的集成,甚至不需要我们的包名和签名,app端集成真的就是几句话代码的事情。
2.按照接口文档说明集成:
android支付详情介绍,这个是支付宝介绍的官方页面,虽然简单,但是足够了,所以感慨下支付宝的工程师的确是很强大,简单实用。具体步骤为:
2.1 下载jar包,然后放在lib文件夹下面,最好下载最新的jar包。
2.2 修改manifest:
添加权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
添加Activity申明:
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
3.代码编辑:
3.1 为了方便我们建一个PayUtils,代码如下:
public class PayUtils {
private Activity mActivity;
public void setActivity(Activity activity) {
mActivity = activity;
setHandle(mActivity);
}
private void setHandle(Activity mact) {
mHandler = new Handler(mact.getMainLooper()) {
public void handleMessage(Message msg) {
Log.i("wy", "11111111111" + msg.what);
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
Log.i("wy", "1");
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
Log.i("wy", "2");
}
break;
}
case SDK_AUTH_FLAG: {
AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
String resultStatus = authResult.getResultStatus();
// 判断resultStatus 为“9000”且result_code
// 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
// 获取alipay_open_id,调支付时作为参数extern_token 的value
// 传入,则支付账户为该授权账户
Log.i("wy", "3");
} else {
// 其他状态值则为授权失败
Log.i("wy", "4");
}
break;
}
default:
break;
}
}
};
}
private static final int SDK_PAY_FLAG = 11;
private static final int SDK_CHECK_FLAG = 12;
private static final int MSG_GET_ACTIVATION = 2;
private static final int SDK_AUTH_FLAG = 2;
private Handler mHandler;
//调用该方法进行支付宝sdk调用
public void pay(final String payInfo) {
Runnable authRunnable = new Runnable() {
@Override
public void run() {
// 构造AuthTask 对象
AuthTask authTask = new AuthTask(mActivity);
// 调用授权接口,获取授权结果
Map<String, String> result = authTask.authV2(payInfo, true);
Message msg = new Message();
msg.what = SDK_AUTH_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread authThread = new Thread(authRunnable);
authThread.start();
}
}
代码很简单,一个handler,一个调用支付宝的pay方法,注意该handler的生成方法,开始我new Handler的时候没有指定looper,因为该类没有默认的Activity对象,所以会报”Can’t create handler inside thread that has not called Looper.prepare()”错误。
3.2 Main中的代码:
public class MainActivity extends AppCompatActivity {
private TextView tv_send;
private PayUtils mPayUtils;
//这些都是服务器定义的字段
private String title = "支付订单";
private String ordertype = "0";
private String tomemid="";
private String price="0.01";
private String price_tbb = "0";
private String paytype = "2";
private String zfpass="";
private String tokenid="";
private String platform = "0";
private String responsestr="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_send= (TextView) findViewById(R.id.tv_send);
tv_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getData();
}
});
}
private void getData(){
Map<String, String> map = new HashMap<>();
map.put("tradetype", "APP");
map.put("title", title);
map.put("ordertype", ordertype);
map.put("tomemid", tomemid);
map.put("price", price);
map.put("price_tbb", price_tbb);
map.put("paytype", paytype);
map.put("zfpass", zfpass);
PayRequestParam param=new PayRequestParam();
param.setTradetype("APP");//用户名
param.setTitle(title);
param.setTomemid(tomemid);
param.setPrice(price);
param.setPrice_tbb(price_tbb + "");
param.setOrdertype(ordertype);//
param.setPaytype(paytype);//
param.setZfpass(zfpass);
param.setSign(SignUtils.getXfbSign(map));
PayRequestObject requestobject=new PayRequestObject();
requestobject.setTokenid(tokenid);
requestobject.setPlatform(platform);
requestobject.setParam(param);
//fastjson
String jsonstr=JSON.toJSONString(requestobject);
String url ="";
//okhttp3
OkHttpClient client=new OkHttpClient();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), jsonstr);
final Request request=new Request.Builder().url(url).post(requestBody).build();
Log.i("wy","111111111111");
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
responsestr=response.body().string();
PayResponseObject object= (PayResponseObject) JSON.parseObject(responsestr,PayResponseObject.class);
if(mPayUtils==null){
mPayUtils=new PayUtils();
mPayUtils.setActivity(MainActivity.this);
}
mPayUtils.pay(object.getData());
}
});
}
}
这里面更多的是和自己服务器定义接口的一些参数,请求获取代调用支付宝时的String 参数payInfo,该参数的组成可以看支付宝的接口文档,我们客服端也可以自己拼接,但是十分不建议这样做。
4总结:
支付宝支付相对微信支付而言简单太多,并且可以在打包的情况下进行测试,方便开发,但是这只是对于我们移动端开发来说方便很多;大量的工作其实是丢锅给了服务器端。但是对于支付宝的文档以及流程我还是建议大家能够细细的研读,这对于我们开发的思路是大有裨益的。ok,两大支付都介绍完了,希望可以帮到大家。