天天看點

Android 支付寶【支付】

支付寶SDK跟新版本疊代,大家可以選擇适合的自己的版本。

個人覺得改版本非常的穩定,頁面也是大衆APp支付界面。

建議先去申請企業 或者 個人開發者.  http://act.life.alipay.com/shopping/before/help/index.html

先上張圖檔,壓壓驚 - ...

Android 支付寶【支付】

支付寶流程圖: 

Android 支付寶【支付】

圖中外部商務用戶端,是我們需要操作的:

1.調用支付接口

2.接收傳回結果資訊,自己根據邏輯處理

外部伺服器,是我們背景需要做的:

1.異步發送支付通知

2.接受響應

支付寶簽約成功會有4個重要的Key值:

Android 支付寶【支付】

這些都是簽約成功,得到的...

用簽約支付寶賬号登入 www.alipay.com 後,在商家服務頁面中擷取.

RSA密鑰生成指令

生成RSA私鑰

openssl>genrsa -out rsa_private_key.pem 1024

生成RSA公鑰

openssl>rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

将RSA私鑰轉換成PKCS8格式

openssl>pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

注意:“>”符号後面的才是需要輸入的指令。

可以參考:

移動支付接口智能SDK版.pdf & 移動支付接口智能SDK版接入與使用規則.pdf

Dome:

簡單 MainActivity:

/**
 * 該本 移動支付接口智能SDK版(20140923)
 * 目前比較穩定
 * @author Neng
 * @version 2014/12/1
 */
public class MainActivity extends Activity {
	
	public static final String TAG = "MainActivity";

	private static final int RQF_PAY = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    public void onButton (View view){
    	//擷取拼接請求URL
    	String orderInfo = getOrderInfo("iphone6 plus", "土豪金", "0.01");
    	//URL 加密-(私鑰)
    	String sign = Rsa.sign(orderInfo, Keys.PRIVATE);
    	// 僅需對sign 做URL編碼
    	try {
			// 僅需對sign 做URL編碼
			sign = URLEncoder.encode(sign, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
    	//最終URl 
		final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"+ getSignType();
		Log.d("最終URl :", payInfo);
		//開啟線程啟動支付寶 - -
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				//**------------AliPay 已經啟動支付寶,使用者操作流程,用戶端是不知道
				AliPay alipay = new AliPay(MainActivity.this, mHandler);
				//設定為沙箱模式,不設定預設為線上環境
				//alipay.setSandBox(true);

				//****支付操作完畢,傳回result結果
				String result = alipay.pay(payInfo);
				Log.i(TAG, "result = " + result);
				
				Message msg = new Message();
				msg.what = RQF_PAY;
				msg.obj = result;
				mHandler.sendMessage(msg);
				
			}
		}).start();
		
    }
    
    
	Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if(msg.what == RQF_PAY){
				//Result主要對資料處理,字元串解析,這裡傳回不是json,隻能拆字段解析
				Result result = new Result((String) msg.obj,Keys.PUBLIC);
				
				Log.i(TAG, "狀态編号 = " + result.getResultStatus());
				//我們需要提示内容不想要支付寶給的内容,這裡可以用自定義内容getHashMapV()
				Log.i(TAG, "支付寶字段内容 = " + result.getMemo());
				Log.i(TAG, "使用者自定義Hap内容 = " + result.getHashMapV());
				
				//隻有成功支付後:支付寶會傳回你的公鑰,作為判斷依據
				Log.i(TAG, "支付一緻?=  " + result.getIsSignOk());
				
			}
			
		}
		
	};


	/**
	 * 建立訂單資訊
	 * @param subject  商品名稱
	 * @param body 商品詳情
	 * @param price 商品金額
	 * @return
	 */
	public String getOrderInfo(String subject, String body, String price) {
		// 合作者身份ID
		String orderInfo = "partner=" + "\"" + Keys.DEFAULT_PARTNER + "\"";

		// 賣家支付寶賬号
		orderInfo += "&seller_id=" + "\"" + Keys.DEFAULT_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\"";

		// 支付寶處理完請求後,目前頁面跳轉到商戶指定頁面的路徑,可空
		orderInfo += "&return_url=\"m.alipay.com\"";

		// 調用銀行卡支付,需配置此參數,參與簽名, 固定值
		// orderInfo += "&paymethod=\"expressGateway\"";

		return orderInfo;
	}
    
	
	/**
	 * 商戶網站唯一訂單号
	 * 自定義,可以伺服器生産
	 */
	private String getOutTradeNo() {
		SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss",
				Locale.getDefault());
		Date date = new Date();
		String key = format.format(date);

		Random r = new Random();
		key = key + r.nextInt();
		key = key.substring(0, 15);
		return key;
	}
	
	private String getSignType() {
		return "sign_type=\"RSA\"";
	}
}
           

記得把 alipay_lib項目 Library -

參考:支付寶Doem

作者簡單整理,歡迎轉載:http://blog.csdn.net/cs_li1126/article/details/41682597

繼續閱讀