【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信支付開發(fā)中Senparc.Weixin.MP的案例分析_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信支付開發(fā)中Senparc.Weixin.MP的案例分析_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信支付開發(fā)中Senparc.Weixin.MP的案例分析_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信支付開發(fā)中Senparc.Weixin.MP的案例分析_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信支付開發(fā)中Senparc.Weixin.MP的案例分析_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信支付開發(fā)中Senparc.Weixin.MP的案例分析

這篇文章主要介紹微信支付開發(fā)中Senparc.Weixin.MP的案例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!公眾號+微信支付SDK:Senparc.Weixin.MP.dll企業(yè)號SDK:Senparc.Weixin.QY.dll開放平臺(tái)SDK:Senparc.Weixin.Open.dll官方地址:/當(dāng)然,我們要完成公眾號微信支付功能的開發(fā),需要使用Senparc.Weixin.MP.dll這個(gè)DLL,查閱了一下官方提供的DEMO以及教程,并沒有載入微信支付相關(guān)的說明,沒辦法,既然拿到源碼了,自己找吧。打開Senparc.Weixin.MP.sln,根據(jù)英文文件夾名稱的分類,可以初步判斷,關(guān)于微信支付,被封裝在TenPayLib文件夾中,但是我還發(fā)現(xiàn),里面存在名稱叫“TenPayLibV3”的文件夾,那如何選擇呢?網(wǎng)上搜索了一下,得出這個(gè)結(jié)論:2014年9月10號之前申請的為v2版,之后申請的為v3版。我用來測試微信支付的服務(wù)號是在16年剛申請,并且通過驗(yàn)證的,那么果斷使用V3吧。打開TenPayLibV3文件夾:這里發(fā)現(xiàn)多個(gè)類庫,每一個(gè)都是做什么的呢?我們這里不一一敘述,感興趣的朋友可以下載來看,每一個(gè)類的文件頭都有功能說明與描述,對照微信官方支付說明,我們直接開始做支付。進(jìn)入微信公眾號,點(diǎn)擊功能菜單中的微信支付:并相應(yīng)點(diǎn)擊使用教程-公眾號支付迅速對文檔內(nèi)容重溫、瀏覽,以方便在Senparc.Weixin.MP.dll中查找相應(yīng)的功能。先配置支付授權(quán)目錄,添加支付測試白名單,支付目錄只支持三個(gè),并且域名必須經(jīng)過ICP備案。授權(quán)目錄的作用是,如果要發(fā)起微信支付請求,請求的鏈接地址必須在授權(quán)目錄下,否則身份無效,支付不能成功。測試白名單中添加的個(gè)人微信號,才能完成微信支付測試目錄支付的測試,不在白名單中人員發(fā)起支付申請,支付不能成功。配置完成后,如何調(diào)用呢?我們繼續(xù)看官方說明:H5調(diào)起支付API“在微信瀏覽器里面打開H5網(wǎng)頁中執(zhí)行JS調(diào)起支付。接口輸入輸出數(shù)據(jù)格式為JSON。注意:WeixinJSBridge內(nèi)置對象在其他瀏覽器中無效。列表中參數(shù)名區(qū)分大小,大小寫錯(cuò)誤簽名驗(yàn)證會(huì)失敗。”O(jiān)K,這里說明了幾個(gè)事情,第一必須在微信瀏覽器進(jìn)行;第二,參數(shù)區(qū)分大小寫;第三,數(shù)據(jù)格式為JSON。官方說明,只要在頁面中調(diào)用如下腳本,即可開啟微信支付功能:function

onBridgeReady(){

WeixinJSBridge.invoke(

'getBrandWCPayRequest',

{

"appId"

"wx2421b1c4370ec43b",

//公眾號名稱,由商戶傳入

"timeStamp":"

1395712654",

//時(shí)間戳,自1970年以來的秒數(shù)

"nonceStr"

"e61463f8efa94090b1f366cccfbbb444",

//隨機(jī)串

"package"

"prepay_id=u802345jgfjsdfgsdg888",

"signType"

"MD5",

//微信簽名方式:

"paySign"

"70EA570631E4BB79628FBCA90534C63FF7FADD89"

//微信簽名

},

function(res){

if(res.err_msg

==

"get_brand_wcpay_request:ok"

)

{}

//

使用以上方式判斷前端返回,微信團(tuán)隊(duì)鄭重提示:res.err_msg將在用戶支付成功后返回

ok,但并不保證它絕對可靠。

}

);

}

if

(typeof

WeixinJSBridge

==

"undefined"){

if(

document.addEventListener

){

document.addEventListener('WeixinJSBridgeReady',

onBridgeReady,

false);

}else

if

(document.attachEvent){

document.attachEvent('WeixinJSBridgeReady',

onBridgeReady);

document.attachEvent('onWeixinJSBridgeReady',

onBridgeReady);

}

}else{

onBridgeReady();

}我的調(diào)用代碼:因?yàn)槲乙邳c(diǎn)擊按鈕確認(rèn)支付之后,在調(diào)用微信支付進(jìn)行后續(xù)操作,把官方代碼提出到方法中function

onBridgeReady()

{

WeixinJSBridge.invoke(

'getBrandWCPayRequest',

{

"appId":

$('#APPID').val(),

//公眾號名稱,由商戶傳入

"timeStamp":

$('#Timestamp').val(),

//時(shí)間戳,自1970年以來的秒數(shù)

"nonceStr":

$('#Noncestr').val(),

//隨機(jī)串

"package":

$('#package').val(),

"signType":

"MD5",

//微信簽名方式:

"paySign":

$('#paySign').val()

//微信簽名

},

function

(res)

{

if

(res.err_msg

==

"get_brand_wcpay_request:ok")

{

//支付成功,后續(xù)自行處理

}

else

{

//支付取消,或者其他錯(cuò)誤,自行處理

}

}

);

}好吧,那這堆參數(shù)是從哪來的,都是啥玩意兒?我們逐個(gè)分析一下:appId:這個(gè)做微信開發(fā)都應(yīng)該知道,公眾號在開發(fā)者菜單就能找到timeStamp:時(shí)間戳,官方描述為“自1970年以來的秒數(shù)”,不用擔(dān)心,肯定能從支付類庫里找到nonceStr:官方解釋是隨機(jī)串“e61463f8efa94090b1f366cccfbbb444”,靠啥玩意兒?詳見隨機(jī)數(shù)生成算法,原來就是一套加密規(guī)則和算法,做過URL請求接口的朋友應(yīng)該知道,有些公司JSON串的簽名方式和這比較類似。package:預(yù)支付ID,調(diào)用官方API統(tǒng)一下單接口可以獲得signType:字符串"MD5"paySign:官方解釋是微信簽名“70EA570631E4BB79628FBCA90534C63FF7FADD89”,好吧,我忍了,在看下簽名生成算法,看來和隨機(jī)串一個(gè)鳥樣到這里,官方的接口說明已經(jīng)了解的很清楚了,那么下面就要解決調(diào)用微信支付的這幾個(gè)參數(shù)了,通過Senparc.Weixin.MP.dll應(yīng)該如何使用呢?既然需要先調(diào)用統(tǒng)一下單接口獲取預(yù)支付訂單ID,好吧,我們先來研究一下,如何獲得這個(gè)ID吧。官方給出了詳細(xì)說明,我們不在贅述,各參數(shù)研究按照上述接口的方式自行研究解決,唯一區(qū)別在于,調(diào)用官方接口需要傳入一個(gè)XML,那很好辦,拼接一下就可以了,預(yù)支付調(diào)用方法如下://這里通過官方的一個(gè)實(shí)體,用戶自行使用,我這里是直接讀取的CONFIG文件

private

static

Senparc.Weixin.MP.TenPayLibV3.TenPayV3Info

tenPayV3Info

=

new

Senparc.Weixin.MP.TenPayLibV3.TenPayV3Info(ConfigurationManager.AppSettings["corpId"],

ConfigurationManager.AppSettings["corpSecret"],

ConfigurationManager.AppSettings["mch_id"]

,

ConfigurationManager.AppSettings["key"],

ConfigurationManager.AppSettings["v3url"]);

///

<summary>

///

微信預(yù)支付

///

</summary>

///

<param

name="attach"></param>

///

<param

name="body"></param>

///

<param

name="openid"></param>

///

<param

name="price"></param>

///

<param

name="orderNum"></param>

///

<returns></returns>

public

static

string

PayInfo(string

attach,

string

body,

string

openid,

string

price,

string

orderNum

=

"1833431773763549")

{

RequestHandler

requestHandler

=

new

RequestHandler(HttpContext.Current);

//微信分配的公眾賬號ID(企業(yè)號corpid即為此appId)

requestHandler.SetParameter("appid",

tenPayV3Info.AppId);

//附加數(shù)據(jù),在查詢API和支付通知中原樣返回,該字段主要用于商戶攜帶訂單的自定義數(shù)據(jù)

requestHandler.SetParameter("attach",

attach);

//商品或支付單簡要描述

requestHandler.SetParameter("body",

body);

//微信支付分配的商戶號

requestHandler.SetParameter("mch_id",

tenPayV3Info.MchId);

//隨機(jī)字符串,不長于32位。

requestHandler.SetParameter("nonce_str",

TenPayUtil.GetNoncestr());

//接收微信支付異步通知回調(diào)地址,通知url必須為直接可訪問的url,不能攜帶參數(shù)。

requestHandler.SetParameter("notify_url",

tenPayV3Info.TenPayV3Notify);

//trade_type=JSAPI,此參數(shù)必傳,用戶在商戶公眾號appid下的唯一標(biāo)識。

requestHandler.SetParameter("openid",

openid);

//商戶系統(tǒng)內(nèi)部的訂單號,32個(gè)字符內(nèi)、可包含字母,自己生成

requestHandler.SetParameter("out_trade_no",

orderNum);

//APP和網(wǎng)頁支付提交用戶端ip,Native支付填調(diào)用微信支付API的機(jī)器IP。

requestHandler.SetParameter("spbill_create_ip",

"");

//訂單總金額,單位為分,做過銀聯(lián)支付的朋友應(yīng)該知道,代表金額為12位,末位分分

requestHandler.SetParameter("total_fee",

price);

//取值如下:JSAPI,NATIVE,APP,我們這里使用JSAPI

requestHandler.SetParameter("trade_type",

"JSAPI");

//設(shè)置KEY

requestHandler.SetKey(tenPayV3Info.Key);

requestHandler.CreateMd5Sign();

requestHandler.GetRequestURL();

requestHandler.CreateSHA1Sign();

string

data

=

requestHandler.ParseXML();

requestHandler.GetDebugInfo();

//獲取并返回預(yù)支付XML信息

return

TenPayV3.Unifiedorder(data);

}

}好的,拿到預(yù)支付訂單的返回?cái)?shù)據(jù),一切又都好辦了,根據(jù)返回參數(shù)的不同,自行解決,我們只關(guān)心調(diào)用正確的過程,操作繼續(xù),在返回的正確XML數(shù)據(jù)中,我們獲取到了<prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>(官方示例),好的,開始在頁面做支付吧!這里,我封裝了一個(gè)實(shí)體,用來傳輸常用的數(shù)據(jù),當(dāng)然,各位也可以參考Senparc.Weixin.MP.dll提供的實(shí)體類。public

class

ShareInfo

{

string

corpId

=

string.Empty;

public

string

CorpId

{

get

{

return

corpId;

}

set

{

corpId

=

value;

}

}

string

ticket

=

string.Empty;

public

string

Ticket

{

get

{

return

ticket;

}

set

{

ticket

=

value;

}

}

string

noncestr

=

string.Empty;

public

string

Noncestr

{

get

{

return

noncestr;

}

set

{

noncestr

=

value;

}

}

string

timestamp

=

string.Empty;

public

string

Timestamp

{

get

{

return

timestamp;

}

set

{

timestamp

=

value;

}

}

private

string

paySign

=

string.Empty;

public

string

PaySign

{

get

{

return

paySign;

}

set

{

paySign

=

value;

}

}

private

string

package

=

string.Empty;

public

string

Package

{

get

{

return

package;

}

set

{

package

=

value;

}

}

}我們繼續(xù),來看一下支付接口需要用到的參數(shù)如何獲?。簆ublic

static

ShareInfo

GetPayInfo(string

prepayid)

{

shareInfo

=

new

ShareInfo();

//檢查是否已經(jīng)注冊jssdk

if

(!JsApiTicketContainer.CheckRegistered(corpId))

{

JsApiTicketContainer.Register(corpId,

corpSecret);

}

JsApiTicketResult

jsApiTicket

=

JsApiTicketContainer.GetTicketResult(corpId);

JSSDKHelper

jssdkHelper

=

new

JSSDKHelper();

shareInfo.Ticket

=

jsApiTicket.ticket;

shareInfo.CorpId

=

corpId.ToLower();

shareInfo.Noncestr

=

JSSDKHelper.GetNoncestr().ToLower();

shareInfo.Timestamp

=

JSSDKHelper.GetTimestamp().ToLower();

shareInfo.Package="prepay_id="

+

prepayid.ToLower();

RequestHandler

requestHandler

=

new

RequestHandler(HttpContext.Current);

requestHandler.SetParameter("appId",

shareInfo.CorpId);

requestHandler.SetParameter("timeStamp",

shareInfo.Timestamp);

requestHandler.SetParameter("nonceStr",

shareInfo.Noncestr);

requestHandler.SetParameter("package",

shareInfo.Package);

requestHandler.SetParameter("signType",

"MD5");

requestHandler.SetKey(tenPayV3Info.Key);

requestHandler.CreateMd5Sign();

requestHandler.GetRequestURL();

requestHandler.CreateSHA1Sign();

shareInfo.PaySign

=

(requestHandler.GetAllParameters()["sign"]).ToString();

return

shareInfo;

}這樣,支付接口需要用到的參數(shù),就都封裝在ShareInfo里了,好吧,調(diào)用之后,我們回到頁面的后置代碼中,或者你采用的ORM對應(yīng)代碼中去,將參數(shù)輸出到頁面//處理頁面支付調(diào)用信息

ShareInfo

shareInfo

=

TenPayModule.GetPayInfo(prepayid);

System.Web.HttpContext.Current.Response.Write(string.Format("<input

type=\"hidden\"

id=\"Noncestr\"

runat=\"server\"

value=\"{0}\"

/>",

shareInfo.Noncestr));

System.Web.HttpContext.Current.Response.Write(string.Format("<input

type=\"hidden\"

id=\"Timestamp\"

runat=\"server\"

value=\"{0}\"

/>",

shareInfo.Timestamp));

System.Web.HttpContext.Current.Response.Write(string.Format("<input

type=\"hidden\"

id=\"APPID\"

runat=\"server\"

value=\"{0}\"

/>",

shareInfo.CorpId));

System.Web.HttpC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論