1.在APP中选购商品
2.生成支付宝支付订单
3.提交订单
4.输入支付密码进行支付

5.支付成功后通知商户后台

准备:

申请支付宝商家ID
公司
个体工商户

商户ID
商户收款的账号
商户私钥




与银联POS支付不同的是,支付宝快捷支付手机终端没有安装支付宝也能支付,这些jar包就相当于一个支付宝客户端的核心模块(如果安装的话也会启动app,没安装的话启动H5进行支付)。

我们使用时核心代码如下

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.alipay.sdk.app.PayTask;
import com.aplipay.utils.Constants;
import com.aplipay.utils.PayResult;
import com.aplipay.utils.SignUtils;

public class PayActivity extends Activity {
	//商户ID
	public static final String PARTNER = Constants.PARTNER;
	//商户收款账号
	public static final String SELLER = Constants.SELLER;
	//商户私钥
	//私钥用于对数据进行签名加密
	//公钥用于对签名进行验证
	public static final String RSA_PRIVATE = Constants.RSA_PRIVATE;
	private String name;
	private String price;
	private String desc;
	
	private final static int MESSAGE_PAY = 1;
	
	private Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case MESSAGE_PAY:
				String result = (String) msg.obj;
				PayResult payResult = new PayResult(result);
				//支付状态码
				String resultStatus = payResult.getResultStatus();
				
				if (TextUtils.equals(resultStatus, "9000")) {
					Toast.makeText(PayActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
				}else if (TextUtils.equals(resultStatus, "8000")) {
					Toast.makeText(PayActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();
				}else{
					Toast.makeText(PayActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
				}
				
				break;

			default:
				break;
			}
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.pay);
		
		//获取商品的详细信息
		Intent intent = getIntent();
		name = intent.getStringExtra("name");
		price = intent.getStringExtra("price");
		desc = intent.getStringExtra("desc");
		
		TextView product_name = (TextView) findViewById(R.id.product_name);
		TextView product_price = (TextView) findViewById(R.id.product_price);
		TextView product_desc = (TextView) findViewById(R.id.product_desc);
		product_name.setText(name);
		product_price.setText(price);
		product_desc.setText(desc);
	}
	
	//支付
	public void pay(View btn){
		//1.构建订单数据
		String orderInfo = getOrderInfo(name, desc, price);
		
		//2.对订单进行签名
		String sign = sign(orderInfo);
		try {
			//转码
			sign = URLEncoder.encode(sign, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		//3.构建一个符合支付宝参数规范的订单数据
		final String payInfo = orderInfo + "&sign=\""+sign +"\"&sign_type=\"RSA\"" ;
		
		//4.调用支付接口
		new Thread(){
			public void run() {
				//支付任务
				PayTask task = new PayTask(PayActivity.this);
				String result = task.pay(payInfo);
				//按照支付宝的规则进行支付结果的解析
				
				Message msg = handler.obtainMessage(MESSAGE_PAY);
				msg.obj = result;
				handler.sendMessage(msg);
			}
		}.start();
		
		//5.处理支付结果
		
	}
	
	/**
	 * 对订单进行签名
	 * @param orderInfo
	 * @return
	 */
	private String sign(String orderInfo) {
		return SignUtils.sign(orderInfo, RSA_PRIVATE);
	}

	/**
	 * 构建订单信息
	 * @param subject 商品名称
	 * @param body 商品详情
	 * @param price 商品金额
	 * @return
	 */
	public String getOrderInfo(String subject, String body, String price) {
		// 签约合作者身份ID
		String orderInfo = "partner=" + "\"" + PARTNER + "\"";

		// 签约卖家支付宝账号
		orderInfo += "&seller_id=" + "\"" + SELLER + "\"";

		// 商户网站唯一订单号
		orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";

		// 商品名称
		orderInfo += "&subject=" + "\"" + subject + "\"";

		// 商品详情
		orderInfo += "&body=" + "\"" + body + "\"";

		// 商品金额
		orderInfo += "&total_fee=" + "\"" + price + "\"";

		// 服务器异步通知页面路径
		orderInfo += "¬ify_url=" + "\"" + "http://notify.msp.hk/notify.htm"
				+ "\"";

		// 服务接口名称, 固定值
		orderInfo += "&service=\"mobile.securitypay.pay\"";

		// 支付类型, 固定值
		orderInfo += "&payment_type=\"1\"";

		// 参数编码, 固定值
		orderInfo += "&_input_charset=\"utf-8\"";

		// 设置未付款交易的超时时间
		// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
		// 取值范围:1m~15d。
		// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
		// 该参数数值不接受小数点,如1.5h,可转换为90m。
		orderInfo += "&it_b_pay=\"30m\"";

		// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
		// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";

		// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
		orderInfo += "&return_url=\"m.alipay.com\"";

		// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
		// orderInfo += "&paymethod=\"expressGateway\"";

		return orderInfo;
	}

	/**
	 * 产生一个包含时间的随机的订单号
	 * @return
	 */
	private String getOutTradeNo() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		Date date = new Date();
		String key = sdf.format(date);
		Random random = new Random();
		key = key + random.nextInt();
		key = key.substring(0, 15);
		return key;
	}
	
	
	
	
	
}