支付寶SDK支付注意點

公司要寫個支付功能,用到了支付寶,用到了微信

關於支付寶,我想記錄一點我自己的個人心得,方便下次溫習,也可以讓大家少走點彎路,能更快地完成公司交給你的開發任務,哈哈,廢話不多說了


第一步:

             我們要通過支付寶簽名驗籤工具生成私鑰啦/公鑰啦並且和對應的  商戶私鑰,pkcs8格式

第二步:

             我們要在對應的商戶服務上面把我們生成的公鑰上傳去哦,這裏要傳2個地方:

             1:如何上傳公鑰

             2:手機網站支付接口公鑰上傳

             以上兩個地方都要上傳的哦,點進去查看怎麼上傳吧

關於支付接口,SKD都封裝得非常好了,所以我們只要把需要傳入的數據傳到支付接口裏就可以了,這裏可以簡單看一下我的寫法

這個是我調用支付的一個方法

AliPay.pay(activity, mHandler, order_no, good_name,buyer_sp_username, et_scan_money.getText().toString(), return_url);

解釋一下上面幾個參數:

activity:這個是我傳過來的上下文-不過這裏我沒用到

mHandler: (這個不用多說)

order_no :這個是我在調用這個方法之前先調用 我們服務器的接口獲取到服務器給我的訂單號

good_name  : 這個是商品名稱

buyer_sp_username : 這個是我傳過去的支付人信息      其實就是商品描述

et_scan_money.getText().toString :這個是我的商品價格

return_url : 這個是我調用這個方法之前調用我們自己接口獲取到的回調地址


下面是AliPay.java這個文件

/**
 * 
 */
package com.kuaibao.skuaidi.payali;

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

import android.app.Activity;
import android.os.Handler;
import android.os.Message;

import com.alipay.sdk.app.PayTask;

/**
 * @author kb38
 *
 */
public class AliPay {
	
	//商戶PID
	public static final String PARTNER = "";
	//商戶收款賬號
	public static final String SELLER = "";
	//商戶私鑰,pkcs8格式
	public static final String RSA_PRIVATE = "";
	public static final int SDK_PAY_FLAG = 1;
	public static final int SDK_CHECK_FLAG = 2;
	
	/**
	 * call alipay sdk pay. 調用SDK支付
	 */
	/**
	 * 
	 * @param activity
	 * @param handler
	 * @param v
	 * @param out_trade_no// 商戶網站唯一訂單號
	 * @param subject// 商品名稱
	 * @param body// 商品詳情
	 * @param price // 商品金額
	 * @param service_url// 服務器異步通知頁面路徑
	 * @param over_time// 超時時間
	 */
	public static void pay(final Activity activity,final Handler handler,String out_trade_no,String subject,String body,String price,String service_url) {
		String orderInfo = getOrderInfo(out_trade_no,subject, body, price,service_url);// 訂單
		String sign = sign(orderInfo);// 對訂單做RSA 簽名
		try {
			sign = URLEncoder.encode(sign, "UTF-8");// 僅需對sign 做URL編碼
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"+ getSignType();// 完整的符合支付寶參數規範的訂單信息
		Runnable payRunnable = new Runnable() {
			@Override
			public void run() {
				PayTask alipay = new PayTask(activity);// 構造PayTask 對象
				String result = alipay.pay(payInfo);// 調用支付接口,獲取支付結果
				Message msg = new Message();
				msg.what = SDK_PAY_FLAG;
				msg.obj = result;
				handler.sendMessage(msg);
			}
		};
		Thread payThread = new Thread(payRunnable);// 必須異步調用
		payThread.start();
	}
	
	/**
	 * create the order info. 創建訂單信息
	 * @param out_trade_no// 商戶網站唯一訂單號
	 * @param subject// 商品名稱
	 * @param body// 商品詳情
	 * @param price // 商品金額
	 * @param service_url// 服務器異步通知頁面路徑
	 * @param over_time// 超時時間
	 * @return
	 */
	public static String getOrderInfo(String out_trade_no,String subject, String body, String price,String service_url) {
		String orderInfo = "partner=" + "\"" + PARTNER + "\"";// 簽約合作者身份ID
		orderInfo += "&seller_id=" + "\"" + SELLER + "\"";// 簽約賣家支付寶賬號
		orderInfo += "&out_trade_no=" + "\"" + out_trade_no + "\"";// 商戶網站唯一訂單號---待修改
		orderInfo += "&subject=" + "\"" + subject + "\"";// 商品名稱
		orderInfo += "&body=" + "\"" + body + "\"";// 商品詳情
		orderInfo += "&total_fee=" + "\"" + price + "\"";// 商品金額
		orderInfo += "¬ify_url=" + "\"" + service_url+ "\"";// 服務器異步通知頁面路徑
		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 += "&extern_token=" + "\"" + extern_token + "\"";// extern_token爲經過快登授權獲取到的alipay_open_id,帶上此參數用戶將使用授權的賬戶進行支付
		orderInfo += "&return_url=\""+service_url+"\"";// 支付寶處理完請求後,當前頁面跳轉到商戶指定頁面的路徑,可空
		// orderInfo += "&paymethod=\"expressGateway\"";// 調用銀行卡支付,需配置此參數,參與簽名, 固定值 (需要簽約《無線銀行卡快捷支付》才能使用)
		return orderInfo;
	}
	/**
	 * get the out_trade_no for an order. 生成商戶訂單號,該值在商戶端應保持唯一(可自定義格式規範)
	 * 
	 */
	public 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;
	}
	
	/**
	 * sign the order info. 對訂單信息進行簽名
	 * 
	 * @param content// 待簽名訂單信息
	 */
	public static String sign(String content) {
		return SignUtils.sign(content, RSA_PRIVATE);
	}
	
	/**
	 * get the sign type we use. 獲取簽名方式
	 * 
	 */
	public static String getSignType() {
		return "sign_type=\"RSA\"";
	}

}

 還有,Android Manifest.xml 裏面一定要加上這句,不然的話你沒有安裝支付寶的話是不會彈出網頁的哦~支付寶還是蠻好的,沒有安裝支付寶的可以跳轉一個H5頁面支付的哦

 <!-- 支付寶支付 -->
        <activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind"
            android:windowSoftInputMode="adjustResize|stateHidden" >
        </activity>

目前我想到的好像就這麼多,發現有問題時我再補充補充~


謝謝~




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章