- 下载支付宝jar包
存放位置如下
2.将jar包添加进依赖
compile files('libs/alipaySdk-20180316.jar')
3.添加权限
<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" />
4.添加活动
<activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation|screenSize" android:exported="false" android:screenOrientation="behind" android:windowSoftInputMode="adjustResize|stateHidden" > </activity> <activity android:name="com.alipay.sdk.app.H5AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" android:windowSoftInputMode="adjustResize|stateHidden" > </activity>
5.在proguard-ules.pro文件中添加混淆,该文件在build.gradle下面
-keep class com.alipay.android.app.IAlixPay{*;} -keep class com.alipay.android.app.IAlixPay$Stub{*;} -keep class com.alipay.android.app.IRemoteServiceCallback{*;} -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;} -keep class com.alipay.sdk.app.PayTask{ public *;} -keep class com.alipay.sdk.app.AuthTask{ public *;} -keep class com.alipay.sdk.app.H5PayCallback { <fields>; <methods>; } -keep class com.alipay.android.phone.mrpc.core.** { *; } -keep class com.alipay.apmobilesecuritysdk.** { *; } -keep class com.alipay.mobile.framework.service.annotation.** { *; } -keep class com.alipay.mobilesecuritysdk.face.** { *; } -keep class com.alipay.tscenter.biz.rpc.** { *; } -keep class org.json.alipay.** { *; } -keep class com.alipay.tscenter.** { *; } -keep class com.ta.utdid2.** { *;} -keep class com.ut.device.** { *;}
6.新建类PayResult
package com.example.test.alipaytest.alipay;
import android.text.TextUtils;
import java.util.Map;
/**
* Created by app-i on 2018/3/24.
*/
public class PayResult {
private String resultStatus;
private String result;
private String memo;
public PayResult(Map<String, String> rawResult) {
if (rawResult == null) {
return;
}
for (String key : rawResult.keySet()) {
if (TextUtils.equals(key, "resultStatus")) {
resultStatus = rawResult.get(key);
} else if (TextUtils.equals(key, "result")) {
result = rawResult.get(key);
} else if (TextUtils.equals(key, "memo")) {
memo = rawResult.get(key);
}
}
}
@Override
public String toString() {
return "resultStatus={" + resultStatus + "};memo={" + memo
+ "};result={" + result + "}";
}
/**
* @return the resultStatus
*/
public String getResultStatus() {
return resultStatus;
}
/**
* @return the memo
*/
public String getMemo() {
return memo;
}
/**
* @return the result
*/
public String getResult() {
return result;
}
}
7.主要代码如下
package com.example.test.alipaytest;
import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.alipay.sdk.app.PayTask;
import com.example.test.alipaytest.alipay.PayResult;
import org.w3c.dom.Text;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final int SDK_PAY_FLAG = 1;
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@Override
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
/**
*对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
* 也就是说,这里的通知只是支付宝返回的支付结果,另外还需要获取服务端返回的信息.
*/
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则是支付成功,否则失败
* 9000这里有漏洞,需要深入判断??
*/
if (TextUtils.equals(resultStatus, "9000")) {
/**
* 真实支付结果还需要依赖服务端返回的信息.
*/
Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT);
} else {
Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT);
}
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
TextView pay = findViewById(R.id.apppay);
pay.setOnClickListener(this);
}
/**
* 用户先将下单的信息上传服务端,服务端返回一个orderInfo
* 再通过orderInfo调起支付宝APP支付.
*/
private void payThread() {
/**
* 这里的orderInfo来源于服务端
* orderInfo值示例:biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%220324023830-1710%22%7D&method=alipay.trade.app.pay&charset=utf-8&version=1.0&app_id=2014100900013222×tamp=2016-07-29+16%3A55%3A53&sign_type=RSA2&sign=mCBmIvPKx3ZqBQkxO4uJ9qSkRp09vQeYTl362ECkXJE1SqPYNNYi7Ev68g9a8fr4Fop5pi8eWt6Lt%2BLBhJfK5obUdOwazNf074%2Bq2c5O73s9qwc9%2FFQMj21FaVJBBJK3f587zjDytWymUBfIHSnAuGT7ZZlJIhp4a4c2WFFCfBtnOaVwxZ3tmnR96M6o1qze0dwQDGeDMGMa5z%2BiPxDNyw5JzE%2B1JGGRedzECtswb5Qk%2F%2FiAZZra7kunyCjBfzDPxSth6ulQ0mvil9PfBRrusJ24SnLrPy%2FPxx%2BAADldQnnWlcz5oZMHCSDgQhQtbjPBGdLYQwat8HNypQwKclKdug%3D%3D
*/
final String orderInfo = "biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%220324023830-1710%22%7D&method=alipay.trade.app.pay&charset=utf-8&version=1.0&app_id=2014100900013222×tamp=2016-07-29+16%3A55%3A53&sign_type=RSA2&sign=mCBmIvPKx3ZqBQkxO4uJ9qSkRp09vQeYTl362ECkXJE1SqPYNNYi7Ev68g9a8fr4Fop5pi8eWt6Lt%2BLBhJfK5obUdOwazNf074%2Bq2c5O73s9qwc9%2FFQMj21FaVJBBJK3f587zjDytWymUBfIHSnAuGT7ZZlJIhp4a4c2WFFCfBtnOaVwxZ3tmnR96M6o1qze0dwQDGeDMGMa5z%2BiPxDNyw5JzE%2B1JGGRedzECtswb5Qk%2F%2FiAZZra7kunyCjBfzDPxSth6ulQ0mvil9PfBRrusJ24SnLrPy%2FPxx%2BAADldQnnWlcz5oZMHCSDgQhQtbjPBGdLYQwat8HNypQwKclKdug%3D%3D";
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(MainActivity.this);
Map<String, String> result = alipay.payV2(orderInfo, true);
Log.e("result:", result.toString());
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.apppay:
payThread();
break;
default:
break;
}
}
}