公司要寫個支付功能,用到了支付寶,用到了微信
關於支付寶,我想記錄一點我自己的個人心得,方便下次溫習,也可以讓大家少走點彎路,能更快地完成公司交給你的開發任務,哈哈,廢話不多說了
第一步:
我們要通過支付寶簽名驗籤工具生成私鑰啦/公鑰啦並且和對應的 商戶私鑰,pkcs8格式
第二步:
我們要在對應的商戶服務上面把我們生成的公鑰上傳去哦,這裏要傳2個地方:
1:如何上傳公鑰
以上兩個地方都要上傳的哦,點進去查看怎麼上傳吧
關於支付接口,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>
目前我想到的好像就這麼多,發現有問題時我再補充補充~
謝謝~