1. 程式人生 > >Android客戶端和Java伺服器端整合支付寶

Android客戶端和Java伺服器端整合支付寶

一、申請移動支付許可權

首先登入【支付寶開放平臺】http://open.alipay.com/platform/home.htm,新增應用,申請移動支付許可權。申請開通支付,是需要公司檔案的,個人是不允許開始支付的。
具體細節就不再詳聊了,下面就講講如何將阿里給出的demo執行起來。

二、阿里支付DEMO

1、概述

(1)支付呼叫頁面及測試

支付寶在呼叫時,會首先看本地是不是存在支付寶客戶端,如果有的話,就直接呼叫客戶端進行支付,如果沒有,則呼叫jar包中的H5頁面支付。
所以在測試時,需要有測試兩種情境:有支付寶客戶端和沒有支付寶客戶端的情況。

(2)、客戶端與伺服器

在demo中大家可以看到,有客戶端的demo也有服務端的demo,大家可能覺得需要服務端寫好之後,客戶端才能整合,其實並不是。整個流程是這樣的:
1,APP客戶端通過SDK傳送支付請求 (客戶端處理)
2,SDK支付成功並同步返回支付結果(客戶端處理)
3,支付寶伺服器向我們的伺服器傳送支付結果字串(服務端處理)
客戶端:從上面的流程可以看出,服務端只是用來接出非同步返回的支付結果的。而支付與同步結果返回都是在客戶端可以直接看得到的。所以在整合支付寶支付介面時,主要功能是在客戶端,即便服務端沒有做整合,也是可能付款成功的。
服務端:服務端只需要新增一個功能:介面支付結果返回

下面幾張圖顯示了整個demo的執行過程,由於沒辦法在真機上錄製gif,所以只能用圖片來代替了。
初始化介面:

點選支付後,跳出確認付款介面:

點選確認付款後,跳出輸入密碼介面:

最後是支付成功介面:

在看DEMO的程式碼之前,我們需要先配置幾個變數:

2、配置幾個變數

這部分會對程式碼中用到的幾個變數的找到方法或生成方法進行講述,部分資料引自支付寶開放平臺。

(1)PID

合作者身份ID(PID)是商戶與支付寶簽約後,商戶獲得的支付寶商戶唯一識別碼。當商戶把支付寶功能接入商戶網站時會用到PID,以便讓支付寶認證商戶。
檢視PID步驟如下:
1、登入支付寶官方網站b.alipay.com
2、點選導航欄中“商家服務”

3、點選“查詢PID、Key”

(2)、APPID、APP SECRET和支付寶公鑰

在https://openhome.alipay.com/platform/createApp.htm頁面,建立一個應用

完成之後:在我的應用中是可以看得到的:

然後轉到帳戶基本資訊頁面:https://openhome.alipay.com/platform/keyManage.htm

在開放平臺金鑰欄,可以找到APPID,APP SECRET,和支付寶金鑰
這三個資料,都是在應用建立後,支付寶為我們生成好的,無法更改!

(3)、生成商戶私鑰【windows生成方法】

(有關mac的生成方法,下面會再補充)
1、下載DEMO及SDK


到文件中心,檢視移動支付對應的文件,文件地址:http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1
然後,點選(SDK&DEMO下載)下載程式碼

2、得到原始私鑰
在程式碼中的DEMO/openssl/bin目錄下,有openssl.exe檔案

開啟openssl.exe
輸入

genrsa -out rsa_private_key.pem 1024

得到生成成功的結果,如下圖:

此時,我們可以在bin資料夾中看到一個檔名為rsa_private_key.pem的檔案

用記事本方式開啟它,可以看到-----BEGIN RSA PRIVATE KEY-----開頭,-----END RSA PRIVATE KEY-----結尾的沒有換行的字串,這個就是原始的私鑰。

但這段原始私鑰程式碼中是用不到的,我們需要將它轉化為PKCS8格式
3、轉換為PKCS8格式
在openssl.exe中輸入:並回車

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

得到生成功的結果,這個結果就是PKCS8格式的私鑰,如下圖:

注意,私鑰是紅框包括的那部分,是不包含BEGIN PRIVATE KEY和END PRIVATE KEY這兩行的。

右鍵點選openssl視窗上邊邊緣,選擇編輯→標記,選中要複製的文字(如上圖),
此時繼續右鍵點選openssl視窗上邊邊緣,選擇編輯→複製,
把複製的內容粘土進一個新的記事本中,可隨便命名,只要知道這個是PKCS8格式的私鑰即可。

(4)、生成商戶私鑰【MAC生成方法】

這裡來講一下mac端如何生成使用者私鑰的,由於mac系統是自帶openssl的,所以只需要開啟終端,利用cd 命令切到任意一個想存放生成Key的資料夾下:
比如,切到下載目錄下

然後執行下面的命令來生成私鑰原始金鑰

openssl genrsa -out rsa_private_key.pem 1024

然後執行下面的命令來生成轉換的PCKS8格式的命令。

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

然後將生成的私鑰複製儲存起來。
從上面的命令可以看出,與windows相比,mac上需要在前面新增openssl指定執行的是openssl命令。其它命令是完全一致的。

(5)、生成使用者公鑰及網頁填充

1、生成公鑰
同樣對於windows使用者而言,直接在openssl.exe中輸入下面的命令:

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

同樣,如果是Mac的同學,輸入的命令應該是如下:

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

得到生成成功的結果,如下圖:

此時,我們可以在bin資料夾中看到一個檔名為rsa_public_key.pem的檔案,用記事本方式開啟它,可以看到-----BEGIN PUBLIC KEY-----開頭,
-----END PUBLIC KEY-----結尾的沒有換行的字串,這個就是公鑰。

在生成網頁以後,複製----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----之間的部分,即那段純程式碼,不要把----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----給複製進去了。中間的這部分就是公鑰。
2、網頁填充
然後到https://openhome.alipay.com/platform/keyManage.htm?keyType=partner(需要登入)中,左側找到合作伙伴金鑰欄,再到右側的RSA加密中,將公鑰貼上進去。由於,我們已經貼上進去了,所以這裡顯示檢視開發者公鑰,在沒填之前寫的是“新增開發者公鑰”

到這裡,所有的準備工作都已經結束了。下面就是配置DEMO的過程了

3、配置DEMO

在剛才下載的sdk&demo的原始碼中,開啟DEMO/客戶端demo/支付寶Android 15.0.1/alipay_demo工程
路徑如下:

在PayDemoActivity中配置幾個變數:

//PID
public static final String PARTNER = "";

在這裡填上我們上面找到的PID;

// 商戶收款賬號
public static final String SELLER = "[email protected]";

然後在SELLER上寫上我們支付寶的登入帳戶,即那個你申請移動支付的支付寶賬號

// 支付寶公鑰
public static final String RSA_PUBLIC ="";

然後在RSA_PUBLIC這裡填上支付寶公鑰

// 商戶私鑰,pkcs8格式
public static final String RSA_PRIVATE = "";

最後是填上RSA_PRIVATE對應的商戶私鑰,注意是PKCS8格式的。
私鑰這部分,注意是----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----之間的部分,即那段純程式碼,不要把----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----給複製進去了。中間的這部分就是公鑰。

現在執行demo就直接可以支付了。

本文中對應的DEMO在文章底部給出。

4、程式碼講解

通過上面的配置,demo應該就直接可以運行了,但這裡所涉及的程式碼,我們再仔細看看
主要的支付與結果返回就是pay()這個函式,這裡完成了支付所需要的所有功能。程式碼如下:

public void pay(View v) {
    …………
    // 訂單資訊
    String orderInfo = getOrderInfo("測試的商品", "該測試商品的詳細描述", "0.01");

    // 對訂單做RSA 簽名
    String sign = sign(orderInfo);
    try {
        // 僅需對sign 做URL編碼
        sign = URLEncoder.encode(sign, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    // 完整的符合支付寶引數規範的訂單資訊
    final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"
            + getSignType();

    Runnable payRunnable = new Runnable() {

        @Override
        public void run() {
            // 構造PayTask 物件
            PayTask alipay = new PayTask(PayDemoActivity.this);
            // 呼叫支付介面,獲取支付結果
            String result = alipay.pay(payInfo);

            Message msg = new Message();
            msg.what = SDK_PAY_FLAG;
            msg.obj = result;
            mHandler.sendMessage(msg);
        }
    };

    // 必須非同步呼叫
    Thread payThread = new Thread(payRunnable);
    payThread.start();
}

這裡總是分了四步來完成支付與結果接收。

第一步:構造定單資訊:

String orderInfo = getOrderInfo("測試的商品", "該測試商品的詳細描述", "0.01");

主要是這句,即在getOrderInfo()函式中完成定單資訊的構造:(這裡對getOrderInfo函式做的精減,更多欄位及意義參考原始碼)

有關paymethod的方法使用,參考:https://cshall.alipay.com/support/help_detail.htm?help_id=476935
各個欄位的意義及取值參考:http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103663&docType=1

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 += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm"
            + "\"";

    …………
    return orderInfo;
}

這裡就是通過我們的提供的商家ID,產品資訊,價格等資訊來構造定單及回撥頁面,這裡需要非常注意的一個地方:

// 伺服器非同步通知頁面路徑
orderInfo += "&noify_url=" + "\"" + "http://notify.msp.hk/notify.htm"
        + "\"";

伺服器非同步通知頁面路徑,首先我們用支付寶支付之後,支付寶會返回給我們兩個通知,一個是同步的,就是我們點選支付後支付寶直接反饋給我們客戶端的資訊,我們可以直接拿到,根據反饋的結果可以初步判定該次交易是否成功,第二個就是伺服器非同步的通知,這個非同步的通知是支付寶的伺服器端發給我們伺服器端的資訊,我們在客戶端是直接獲取不了的,那支付寶的伺服器怎麼知道我們伺服器的路徑呢,那就是這引數的作用了,我們給支付寶伺服器一個路徑,它就會在訂單狀態改變的時候給我們伺服器端一個反饋,告訴伺服器這次交易的狀態,如果伺服器結果判定該次交易成功了,就必須返給支付寶伺服器一個success,要不伺服器會一直給我們非同步通知,因為它不知道該次交易是否完成了(一般情況下25小時內8次通知,頻率一般是2m 10m 10m 1h 2h 6h 15h),我們一般會在收到非同步通知時,對訂單的狀態進行更新。
其它的就不講了,通過看原始碼都能看得懂,比如構造訂單號啥的。

第二步:對訂單字串做RSA簽名

為什麼要簽名呢?當然是防止傳輸出錯了,這可是跟錢相關的,如果orderInfo傳輸過程中出錯了,那怎麼樣來校驗它是不是出錯了呢,只有通過簽名演算法來了。所以這裡就需要對訂單字串做簽名。
具體簽名演算法就不講了,直接應用到專案中就行,不需要理解,如果想看看怎麼實現的,裡面有對應的原始碼,可以去研究一下。

// 對訂單做RSA 簽名
String sign = sign(orderInfo);
try {
    // 僅需對sign 做URL編碼
    sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

第三步:構造完成的請求字串

在訂單字串和簽名做完以後,就可以用他們來構造完整的請求字串了:

// 完整的符合支付寶引數規範的訂單資訊
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"
        + getSignType();

第四步:請求與結果返回

最後是傳送請求,程式碼如下:

Runnable payRunnable = new Runnable() {

    @Override
    public void run() {
        // 構造PayTask 物件
        PayTask alipay = new PayTask(PayDemoActivity.this);
        // 呼叫支付介面,獲取支付結果
        String result = alipay.pay(payInfo);

        Message msg = new Message();
        msg.what = SDK_PAY_FLAG;
        msg.obj = result;
        mHandler.sendMessage(msg);
    }
};

// 必須非同步呼叫
Thread payThread = new Thread(payRunnable);
payThread.start();

最關鍵的部分在這裡:

PayTask alipay = new PayTask(PayDemoActivity.this);
// 呼叫支付介面,獲取支付結果
String result = alipay.pay(payInfo);

Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);

在String result = alipay.pay(payInfo);中,就直接獲得了支付結果;
然後通過handler將結果傳送出去。

3. 伺服器整合

集成了客戶端,工作才剛剛完成一半,支付寶客戶端返回了支付結果後,應用伺服器的資料庫中,訂單的狀態並沒有改變,如果依賴客戶端通知伺服器改變訂單狀態,那是十分危險的,就好像剛剛說過的一樣,任何程式設計師經過一定的努力,都可能傳送資料給你的應用伺服器,改變你訂單的狀態,這樣,即使沒有支付,訂單的狀態也會變成已支付,所以,訂單狀態的改變,一定要依賴伺服器的資料互動。

那麼當前端完成支付以後,資料如何互動呢?notify_url !

還記得前端構造的訂單資料中的notify_url麼,支付寶伺服器就是利用這個配置,將伺服器資料POST到這個地址上的,所以在進行伺服器整合之前,你要保證你的伺服器已經能夠接收到請求。

1. 伺服器同步的訂單資料

支付寶伺服器傳送給我們的資料,可以用如下的Bean來描述。

package com.wenxi.alipay.bean;

import java.io.Serializable;
import java.util.Date;

import com.alibaba.fastjson.annotation.JSONField;

public class AlipayNotification implements Serializable{

    /**
	 * 
	 */
    private static final long serialVersionUID = -8638199167144867399L;

    private Integer alipayNoticeId;

    private String notifyId;

    private String notifyType;

    @JSONField(format="yyyy-MM-dd HH:mm:ss")
    private Date notifyTime;

    private String signType;

    private String sign;

    private String outTradeNo;

    private String subject;

    private String paymentType;

    private String tradeNo;

    private String tradeStatus;

    private String sellerId;

    private String sellerEmail;

    private String buyerId;

    private String buyerEmail;

    private Double totalFee;

    private Integer quantity;

    private Double price;

    private String body;

    @JSONField(format="yyyy-MM-dd HH:mm:ss")
    private Date gmtCreate;

    @JSONField(format="yyyy-MM-dd HH:mm:ss")
    private Date gmtPayment;

    private String isTotalFeeAdjust;

    private String userCoupon;

    private String discount;

    private String refundStatus;

    @JSONField(format="yyyy-MM-dd HH:mm:ss")
    private Date gmtRefund;

    private Boolean verifyResult;

    public String getNotifyId() {
        return notifyId;
    }

    public void setNotifyId(String notifyId) {
        this.notifyId = notifyId == null ? null : notifyId.trim();
    }

    public String getNotifyType() {
        return notifyType;
    }

    public void setNotifyType(String notifyType) {
        this.notifyType = notifyType == null ? null : notifyType.trim();
    }

    public Date getNotifyTime() {
        return notifyTime;
    }

    public void setNotifyTime(Date notifyTime) {
        this.notifyTime = notifyTime;
    }

    public String getSignType() {
        return signType;
    }

    public void setSignType(String signType) {
        this.signType = signType == null ? null : signType.trim();
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign == null ? null : sign.trim();
    }

    public String getOutTradeNo() {
        return outTradeNo;
    }

    public void setOutTradeNo(String outTradeNo) {
        this.outTradeNo = outTradeNo == null ? null : outTradeNo.trim();
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject == null ? null : subject.trim();
    }

    public String getPaymentType() {
        return paymentType;
    }

    public void setPaymentType(String paymentType) {
        this.paymentType = paymentType == null ? null : paymentType.trim();
    }

    public String getTradeNo() {
        return tradeNo;
    }

    public void setTradeNo(String tradeNo) {
        this.tradeNo = tradeNo == null ? null : tradeNo.trim();
    }

    public String getTradeStatus() {
        return tradeStatus;
    }

    public void setTradeStatus(String tradeStatus) {
        this.tradeStatus = tradeStatus == null ? null : tradeStatus.trim();
    }

    public String getSellerId() {
        return sellerId;
    }

    public void setSellerId(String sellerId) {
        this.sellerId = sellerId == null ? null : sellerId.trim();
    }

    public String getSellerEmail() {
        return sellerEmail;
    }

    public void setSellerEmail(String sellerEmail) {
        this.sellerEmail = sellerEmail == null ? null : sellerEmail.trim();
    }

    public String getBuyerId() {
        return buyerId;
    }

    public void setBuyerId(String buyerId) {
        this.buyerId = buyerId == null ? null : buyerId.trim();
    }

    public String getBuyerEmail() {
        return buyerEmail;
    }

    public void setBuyerEmail(String buyerEmail) {
        this.buyerEmail = buyerEmail == null ? null : buyerEmail.trim();
    }

    public Double getTotalFee() {
        return totalFee;
    }

    public void setTotalFee(Double totalFee) {
        this.totalFee = totalFee;
    }

    public Integer getQuantity() {
        return quantity;
    }

    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body == null ? null : body.trim();
    }

    public Date getGmtCreate() {
        return gmtCreate;
    }

    public void setGmtCreate(Date gmtCreate) {
        this.gmtCreate = gmtCreate;
    }

    public Date getGmtPayment() {
        return gmtPayment;
    }

    public void setGmtPayment(Date gmtPayment) {
        this.gmtPayment = gmtPayment;
    }

    public String getIsTotalFeeAdjust() {
        return isTotalFeeAdjust;
    }

    public void setIsTotalFeeAdjust(String isTotalFeeAdjust) {
        this.isTotalFeeAdjust = isTotalFeeAdjust == null ? null : isTotalFeeAdjust.trim();
    }

    public String getUserCoupon() {
        return userCoupon;
    }

    public void setUserCoupon(String userCoupon) {
        this.userCoupon = userCoupon == null ? null : userCoupon.trim();
    }

    public String getDiscount() {
        return discount;
    }

    public void setDiscount(String discount) {
        this.discount = discount == null ? null : discount.trim();
    }

    public String getRefundStatus() {
        return refundStatus;
    }

    public void setRefundStatus(String refundStatus) {
        this.refundStatus = refundStatus == null ? null : refundStatus.trim();
    }

    public Date getGmtRefund() {
        return gmtRefund;
    }

    public void setGmtRefund(Date gmtRefund) {
        this.gmtRefund = gmtRefund;
    }

    public Integer getAlipayNoticeId() {

		return alipayNoticeId;
    }

    public void setAlipayNoticeId(Integer alipayNoticeId) {

	this.alipayNoticeId = alipayNoticeId;
    }

	public Boolean getVerifyResult() {

		return verifyResult;
	}

	public void setVerifyResult(Boolean verifyResult) {

		this.verifyResult = verifyResult;
	}

}

當然獲取這些資料需要一些額外的工作,首先它們存在Request物件中,其次它們是underscore case,所以Sample程式碼中,先把這些資料用AsynAlipayNotifyController接收到,並且轉化成我們能夠處理的Bean格式。

其中,outTradeNo可能我們最關心的業務資料,是應用伺服器中的訂單ID,狀態的改變幾乎全憑它。

2. 資料校驗

資料校驗的程式碼,基本上就是支付寶Java伺服器Demo中的程式碼,需要配置的只有PID,程式碼中已經提供了支付寶公鑰,這裡不需要修改。

資料校驗的核心程式碼在這裡:

public static boolean verify(Map<String, String> params) {
        // 判斷responsetTxt是否為true,isSign是否為true
        // responsetTxt的結果不是true,與伺服器設定問題、合作身份者ID、notify_id一分鐘失效有關
	// isSign不是true,與安全校驗碼、請求時的引數格式(如:帶自定義引數等)、編碼格式有關
	String responseTxt = "false";
	if (params.get("notify_id") != null) {
		String notify_id = params.get("notify_id");
		responseTxt = verifyResponse(notify_id);
	}
	String sign = "";
	if (params.get("sign") != null) {
	        sign = params.get("sign");
	}
	boolean isSign = getSignVeryfy(params, sign);
	if (isSign && responseTxt.equals("true")) {
		return true;
	} else {
		return false;
	}
}

首先校驗通知ID,這個ID的是有有效期的,所以如果用測試資料POST到伺服器,可能還要注意ID是不是過期,然後就是簽名校驗,簽名校驗使用了支付寶公鑰。然後根據校驗結果,就可以實現相應的業務邏輯了。

相關推薦

Android客戶Java伺服器整合支付

一、申請移動支付許可權 首先登入【支付寶開放平臺】http://open.alipay.com/platform/home.htm,新增應用,申請移動支付許可權。申請開通支付,是需要公司檔案的,個人是不允許開始支付的。 具體細節就不再詳聊了,下面就講講如何將阿里給出的demo執行起來。 二、阿里支付D

Android客戶java伺服器的Socket連線

開發十年,就只剩下這套架構體系了! >>>   

[原始碼和文件分享]基於Android Studio實現的論壇網站Android客戶JAVA EE後臺

第一章 概述 1.1 開發環境 本安卓程式在Windows 10系統下使用Android Studio開發,後臺使用MyEclipse開發,測試環境為安卓系統5.1、4.4、4.3、5.0,螢幕尺寸5.0、5.1、5.5的安卓手機。 1.2 安裝配置 本安卓程式要求安卓SDK為API

Socket通訊——C++伺服器Java客戶

//更新 這件事可以用現有的序列化框架來做 比如 protobuf 一句話來說就是,C++和Java 通過socket進行通訊、資料傳輸,通過傳送“位元組流”即可。 位元組對於C++和java來說是通用的,但是傳輸的過程有許多問題需要注意,我為了弄清楚這個過程,查了一些資料

AndroidJava伺服器資料互動Java物件轉換成JSON物件

Ticket封裝成一個類 package com.model; public class Ticket { private int ticket_id; private int price; private int user

再談Redirect 客戶重定向 Dispatch 伺服器重定向

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

安裝oracle 11g 64位伺服器oracle 11g 32位客戶時,客戶無法連線伺服器的問題。

1.按照網上教程安裝64位伺服器端Oracle和32位客戶端Oracle,在開始選單點選client檔案下的Net Configuration Assistant,如圖所示 2.本地網路服務配置->新增->服務名為orcl->選擇TCP->主機名

java與c語言之間的socket通訊—c客戶java伺服器

寫在前面的宣告:程式例子均執行在ubuntu(是一個以桌面應用為主的Linux作業系統)上。當然你也可以把java執行在其它系統上,這裡只是為了方便。 上一篇文章已經說明了關於socket的一些知識,but這是遠遠不夠的,我相信只要你感興趣,學習它並不是什麼難事。 好吧,我

Android客戶+mysql+springmvc伺服器實現登陸的小案例

首先是客戶端 通過輸入使用者名稱+密碼實現登入 點選登入後向伺服器傳送http請求 伺服器收到請求後驗證使用者名稱密碼是否與mysql資料庫上的相應欄位是否一致 然後返回json資料 客戶端獲取響應的結果 然後提醒是否登入成功 MainActivity程式碼: public

java伺服器獲取客戶IP地址

在開發工作中,我們常常需要獲取客戶端的IP。一般獲取客戶端的IP地址的方法是:request.getRemoteAddr();但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了。 原因:由於在客戶端和服務之間增加了中間代理,因此伺服器無法直

VTP配置伺服器server客戶client,客戶會學習伺服器的VLAN

這種標題,看到就方了,什麼是VTP,trunk、channel這些配置過相關的命令,但是我不理解啊,這樣還能搭小型區域網絡? 本來是要求用dns3、或者eve做的實驗的,因為這兩款模擬器可以模擬真機,然後抓包,天天抓包,天天抓包,果然是學網路了 但是.....!!! 由於我

android客戶servlet服務的簡單登入實現

本文實現了一個android客戶端輸入使用者名稱和密碼登入跳轉到其他android客戶端介面的簡單demo,主要是熟悉android客戶端的網路程式設計,服務端的程式設計,資料庫的操作。 1、android客戶端 主介面如下所示: 對應的佈局檔案: activity_ma

關於c++(客戶)JAVA(服務)的TCP通訊(基於stomp協議)(一)

最近在做軟體外掛的更新服務,其中涉及到客戶端和服務端通訊,採取服務端推送的形式進行更新資料包的推送。 經過商討後採取TCP通訊,由於服務端是JAVA的,客戶端是C++。 在http://wenku.baidu.com/view/5eb31ea1284ac850ad0242

實現Android客戶與Eclipse伺服器基於Okthhp簡單通訊

最近在重溫知識,所以藉此機會也想把自己寫的一些心得寫出來供大家分享,寫的有誤或者不好的地方望大家見諒,好了,廢話少說,直接進入正題,下面給大家介紹的就是基於目前主流網路通訊框架的okhttp實現的Android與Eclipse通訊。首先說明:我用的Android客戶端是And

客戶android/ios)與java服務tomcat的gzip實現

開始之前我們先來簡單說說gzip是幹什麼用的,為什麼要用 我們來舉個栗子 同一個請求他們使用gzip和不使用是完全兩個結果 例子一:正常未通過gzip壓縮的返回資料大小是100kb 例子二:添加了gzip壓縮的資料的返回資料大小可能只有40-20

Java伺服器List物件轉換為JSON物件並返回客戶例項

一、什麼是JSON   JSON 即 JavaScript Object Natation(Java物件表示法),它是一種輕量級的資料交換格式,非常適合於伺服器與 JavaScript 的互動。   簡而言之,JSON就是JavaScript交換資料的一種格式。例子如下: {"username":"cool

cocos2d-x客戶Java伺服器的通訊(一)

(⊙o⊙)…貌似自己已經有一段時間沒有寫部落格了,其實主要原因還是覺得自己水平有限,加上上班實在是太忙,實在抽不出時間來寫部落格。言歸正傳,大家都知道,在網路遊戲開發中, 網路通訊一直是個比較大的難題,一個伺服器可能要同時處理幾千上萬甚至上百萬的使用者資料,當然,僅僅是通訊

Explorer : 發布一個key-value存儲系統,帶有客戶服務器

srv 方式 clas explorer 啟動服務 exp 默認 b+ .cn Explorer 一個key-value存儲系統,帶有客戶端和服務器端。使用非常方便。 使用B+樹作為存儲引擎,客戶端和服務器端使用TCP協議進行通信。 代碼采用C++實現,底層將客

JavaScript前端Java的AES加密解密

proto creat eight prop pen 保持 超出範圍 system creator 在實際開發項目中,有些數據在前後端的傳輸過程中需要進行加密,那就需要保證前端和後端的加解密需要統一。這裏給大家簡單演示AES在JavaScript前端和Java後端是如何實現

PHP獲取客戶服務器IP(轉)

light 代理ip pre 客戶端測試 function 變量 clas env 環境 客戶端的ip變量: $_SERVER[‘REMOTE_ADDR‘] :客戶端IP,也有可能是代理IP $_SERVER[‘HTTP_CLIENT_IP‘]:代理端的IP,可能存在,也可