




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海售電合同范本
- 兄弟爭房子合同范本
- 農(nóng)村魚塘承包合同范本
- 合作協(xié)議合同范本4人
- 買賣見證合同范本
- 冶煉設(shè)備租賃合同范本
- 代理英國租房合同范本
- 出租車成本監(jiān)審合同范本
- 醫(yī)療設(shè)備轉(zhuǎn)租合同范本
- 含租房屋銷售合同范例
- 2024年中考英語第一次模擬試卷-(廣州卷)(全解全析)
- 三年級數(shù)學(xué)《搭配中的學(xué)問》 全國一等獎(jiǎng)
- 使用農(nóng)產(chǎn)品承諾函
- 分式方程說課王彥娥
- 【康養(yǎng)旅游產(chǎn)業(yè)發(fā)展研究國內(nèi)外文獻(xiàn)綜述3700字】
- 2023配電網(wǎng)施工典型工藝
- 少兒美術(shù)幼兒園課件- 4-6歲 《沙漠鴕鳥》
- ChatGPT人工智能與通用大模型演講稿
- 撤場通知書( 模板)
- 天津市基本醫(yī)療保險(xiǎn)意外傷害首診報(bào)告卡
- 泛光照明技術(shù)標(biāo)準(zhǔn)
評論
0/150
提交評論