天天看点

Android——支付宝SDK调用(移动应用接入支付宝支付,提供安全、便捷的支付能力)

前言

支付宝,是以每个人为中心,以实名和信任为基础的一站式场景平台。

自2004年成立以来,支付宝已经与超过200家金融机构达成合作,为近千万小微商户提供支付服务,拓展的服务场景不断增加。

支付宝也得到了更多用户的喜爱,截至2015年6月底,实名用户数已经超过4亿。

在覆盖绝大部分线上消费场景的同时,支付宝也正在大力拓展各种线下场景,包括餐饮、超市、便利店、出租车、公共交通等。

准备工作

1,需要开发者到支付宝的开发者平台注册申请,提交相关资料审核,审核通过后会获得合作者ID(PID)。

接口申请url

创建应用

Android——支付宝SDK调用(移动应用接入支付宝支付,提供安全、便捷的支付能力)

2,下载支付包集成开发包。

支付宝集成开发包

Android——支付宝SDK调用(移动应用接入支付宝支付,提供安全、便捷的支付能力)

(3)解压支付宝SDK集成包,里面有说明文档,DEMO,主要用到的是支付宝接口和DEMO。

Android——支付宝SDK调用(移动应用接入支付宝支付,提供安全、便捷的支付能力)

3,集成

(1)导入开发资源

Android——支付宝SDK调用(移动应用接入支付宝支付,提供安全、便捷的支付能力)

(2)修改Manifest 

在商户应用工程的AndroidManifest.xml文件里面添加声明:

<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>
           

和权限声明:

<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" />
           

(3) 添加混淆规则

-libraryjars libs/alipaySdk-20151103.jar
 
-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 *;}
           

(4)设置支付的商户号PID,收款账号,商户私钥,支付宝公钥,回调地址。

Android——支付宝SDK调用(移动应用接入支付宝支付,提供安全、便捷的支付能力)
public class AlibabaPay {
	// 商户PID
	public static final String PARTNER = "XXXXXXXXX";
	// 商户收款账号
	public static final String SELLER = "XXXXXX";
	// 商户私钥,pkcs8格式
	public static final String RSA_PRIVATE = "XXXX";
	// 支付宝公钥
	public static final String RSA_PUBLIC = "XXXXXXXXXX";
	// 回调地址
	public static final String NOTIFY_URL = "http:XXXXXXXXXXX.htmL";
	
	
	public final static int RQF_PAY = 1;
	public final String TAG = "alibaba-pay";
	public String orderName;
	public String orderDescription;
	public String orderSn;
	public String orderPrice;

	public String privateKey;
	public String defSeller;
	public String defPartner;
	public String publicKey;
	public String notifyUrl;
	private Handler mHandler;
	private Activity mActivity;

	public AlibabaPay(Handler h, Activity activity) {
		mHandler = h;
		mActivity = activity;
	}

	public void pay() {

		try {
			Log.i(TAG, "pay()");
			String info = getNewOrderInfo();
			// 对订单做RSA 签名
			String sign = SignUtils.sign(info, this.privateKey);
			try {
				// 仅需对sign 做URL编码
				sign = URLEncoder.encode(sign, "UTF-8");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}

			// 完整的符合支付宝参数规范的订单信息
			final String payInfo = info + "&sign=\"" + sign + "\"&"
					+ getSignType();

			final String orderInfo = info;
			new Thread() {
				public void run() {
					PayTask alipay = new PayTask(mActivity);
					// 调用查询接口,获取查询结果
					String result = alipay.pay(payInfo);
					Message msg = new Message();
					msg.what = RQF_PAY;
					msg.obj = result;
					mHandler.sendMessage(msg);
					;
				}
			}.start();

		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	private String getNewOrderInfo() {
		StringBuilder sb = new StringBuilder();
		sb.append("partner=\"");
		sb.append(defPartner);
		sb.append("\"&seller_id=\"");
		sb.append(this.defSeller);
		sb.append("\"&out_trade_no=\"");
		sb.append(orderSn);
		sb.append("\"&subject=\"");
		sb.append(orderName);
		sb.append("\"&body=\"");
		sb.append(orderDescription);
		sb.append("\"&total_fee=\"");
		sb.append(orderPrice);
		sb.append("\"¬ify_url=\"");

		// 网址需要做URL编码
		sb.append(this.notifyUrl);
		sb.append("\"&service=\"mobile.securitypay.pay");
		sb.append("\"&_input_charset=\"utf-8");
		sb.append("\"&return_url=\"");
		sb.append("http://m.alipay.com");
		sb.append("\"&payment_type=\"1");
		sb.append("\"&it_b_pay=\"30m");
		// 如果show_url值为空,可不传
		// sb.append("\"&show_url=\"");
		sb.append("\"&it_b_pay=\"1m");
		sb.append("\"");
		return sb.toString();
	}

	private String getSignType() {
		return "sign_type=\"RSA\"";
	}
}
           

5,添加订单信息,比如订单号, 订单名称,订单价格等等。

(私钥和商户号ID,回调地址 都是通过服务端返回的,也可以不通过服务端返回就在这个类AlibabaPay写死。)

AlibabaPay alipay = new AlibabaPay(mHandler,当前activity);
alipay.orderDescription = "订单详情";
alipay.orderName = "订单名称";
alipay.orderPrice ="";// 订单价格
alipay.orderSn = ""; //订单编号
alipay.defPartner =+ ""; //商户号ID(PID)
alipay.privateKey = ""; //私钥
alipay.notifyUrl = ""; //回调地址
alipay.pay();
           

6,支付返回结果信息。

private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case AlibabaPay.RQF_PAY:
				PayResult payResult = new PayResult((String) msg.obj);
				// 支付宝返回此次支付结果及加签,建议对支付宝签名信息拿签约时支付宝提供的公钥做验签
				String resultInfo = payResult.getResult();
				String resultStatus = payResult.getResultStatus();
				// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
				if (TextUtils.equals(resultStatus, "9000")) {
					Toast.makeText(HPDSOrderSubmitResultActivity.this, "支付成功",
							Toast.LENGTH_SHORT).show();
					finish();
				} else {
					// 判断resultStatus 为非“9000”则代表可能支付失败
					// “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
					if (TextUtils.equals(resultStatus, "8000")) {
						Toast.makeText(HPDSOrderSubmitResultActivity.this,
								"支付结果确认中", Toast.LENGTH_SHORT).show();
						finish();

					} else {
						// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
						Toast.makeText(HPDSOrderSubmitResultActivity.this, "支付失败",
								Toast.LENGTH_SHORT).show();
						finish();
					}
				}
				break;
			default:
				break;
			}
		};
	};
           

注:我这边使用支付宝SDK的JAR是14年下载的~(如果开发中有问题可以这里留言。) 

Android——支付宝SDK调用(移动应用接入支付宝支付,提供安全、便捷的支付能力)

继续阅读