C#開發(fā)微信門戶及應(yīng)用(38)--微信搖一搖紅包功能

搖一搖周邊紅包接口是為線下商戶提供的發(fā)紅包功能。用戶可以在商家門店等線下場所通過搖一搖周邊領(lǐng)取商家發(fā)放的紅包。我曾經(jīng)在《C#開發(fā)微信門戶及應(yīng)用(28)--微信“搖一搖·周邊”功能的使用和接口的實現(xiàn)》介紹過微信搖一搖的相關(guān)管理,包括頁面辐益、設(shè)備之間的關(guān)系毫玖,以及使用等方面內(nèi)容。本篇繼續(xù)介紹搖一搖設(shè)備的另外一項功能,搖一搖紅包功能只磷,介紹如何利用微信搖搖周邊的后臺配置好頁面及地址蝙斜,然后通過微信JSSDK的方式名惩,搖一搖獲取紅包的整個流程功能。

1孕荠、微信搖一搖紅包功能介紹

功能說明
搖一搖周邊紅包接口是為線下商戶提供的發(fā)紅包功能娩鹉。用戶可以在商家門店等線下場所通過搖一搖周邊領(lǐng)取商家發(fā)放的紅包攻谁,在線上轉(zhuǎn)發(fā)分享無效。
開發(fā)者可通過接口開發(fā)搖一搖紅包功能弯予,特點包括:
可選擇使用模板加載頁或自定義Html5頁面調(diào)起微信原生紅包頁面(詳見創(chuàng)建紅包活動中use_template字段戚宦,1為使用模板,2為使用自定義Html5頁面)
原生紅包頁面拆紅包锈嫩,無需通過公眾號消息下發(fā)
提供關(guān)注公眾號能力阁苞,用戶可自行選擇是否關(guān)注(裂變紅包分享時無效)
完成頁面可配置跳轉(zhuǎn)鏈接,可跳轉(zhuǎn)商戶的其他自定義Html5頁面
同一個用戶在單個紅包活動中只能領(lǐng)取1次紅包

用戶側(cè)交互流程
常規(guī)的搖一搖紅包的流程如下所示祠挫,這里沒有使用用戶自定義的模板那槽,也就是使用系統(tǒng)內(nèi)置的(努力加載中。等舔。骚灸。)的頁面,紅包需要自己拆開慌植。


紅包組件接口調(diào)用流程
申請紅包接口權(quán)限:登錄搖一搖周邊商戶后臺https://zb.weixin.qq.com ,進入開發(fā)者支持甚牲,申請開通搖一搖紅包組件接口;
紅包預(yù)下單:調(diào)用微信支付的api進行紅包預(yù)下單,告知需要發(fā)放的紅包金額蝶柿,人數(shù)丈钙,生成紅包ticket;
創(chuàng)建活動并錄入紅包信息:調(diào)用搖周邊平臺的api錄入創(chuàng)建紅包活動并錄入信息交汤,傳入預(yù)下單時生成的紅包ticket雏赦;
調(diào)用jsapi抽紅包:在搖出的頁面中通過調(diào)用jsapi抽紅包,抽中紅包的用戶可以拆紅包芙扎;
調(diào)用以上接口時星岗,紅包提供商戶和紅包發(fā)放商戶公眾號要求一致。

搖一搖紅包的處理過程可以先的流程說明戒洼,申請權(quán)限后俏橘,需要在搖一搖后臺配置相關(guān)的紅包處理頁面,然后通過紅包接口處理提交紅包數(shù)據(jù)圈浇,最后通過搖一搖的設(shè)備搖出界面寥掐,使用JSAPI實現(xiàn)抽取紅包的操作,具體過程如下所示磷蜀。


其中紅包接口處理召耘,是調(diào)用一系列的紅包接口實現(xiàn)的,包括紅包預(yù)下單蠕搜、創(chuàng)建紅包活動怎茫、錄入紅包信息等操作收壕,如下所示妓灌。

搖一搖紅包功能開通在后臺獲取接口即可轨蛤,如下所示。

假設(shè)已經(jīng)有相關(guān)的搖一搖設(shè)備(如果沒有或者需要加入新的搖一搖設(shè)備虫埂,請參考上篇隨筆《C#開發(fā)微信門戶及應(yīng)用(28)--微信“搖一搖·周邊”功能的使用和接口的實現(xiàn)》的相關(guān)介紹祥山,有了設(shè)備后在頁面管理中添加一個頁面,用來處理搖一搖的信息的掉伏。

頁面的信息缝呕,就是添加自定義鏈接界面,如下所示斧散。

然后配置好URL地址接口供常,URL地址還需要考慮如何獲取用戶的openid,因為搖一搖紅包接口必須要獲得當前用戶的openid信息鸡捐,我們可以通過重定向的方式栈暇,使用code獲取對應(yīng)的openid信息,具體后面詳細介紹箍镜。

2源祈、紅包接口處理

前面介紹了,紅包接口處理色迂,是調(diào)用一系列的紅包接口實現(xiàn)的香缺,包括紅包預(yù)下單、創(chuàng)建紅包活動歇僧、錄入紅包信息等操作图张,如下所示。


那么我們就需要分別對這些操作進行封裝诈悍,并提交相關(guān)的數(shù)據(jù)了埂淮。
根據(jù)前面隨筆《C#開發(fā)微信門戶及應(yīng)用(33)--微信現(xiàn)金紅包的封裝及使用》里面的規(guī)則,我們把搖一搖的相關(guān)接口也放在這個ILotteryApi接口和LotteryApi實現(xiàn)類里面写隶,如下所示倔撞。

下面的搖一搖紅包接口全部是基于上面的接口和實現(xiàn)類進行完善處理的。

1)紅包預(yù)下單
接口說明
設(shè)置單個紅包的金額慕趴,類型等痪蝇,生成紅包信息。預(yù)下單完成后冕房,需要在72小時內(nèi)調(diào)用jsapi完成抽紅包的操作躏啰。(紅包過期失效后,資金會退回到商戶財付通帳號耙册。)
接口調(diào)用說明

服務(wù)器端調(diào)用
http請求方式: POST
https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder
POST數(shù)據(jù)格式:XML
需要商戶證書

請求示例

<xml>     
<sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>     
<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>     
<mch_id><![CDATA[10000097]]></mch_id>     
<wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>     
<send_name><![CDATA[send_name]]></send_name>     
<hb_type><![CDATA[NORMAL]]></hb_type>     
<auth_mchid><![CDATA[10000098]]></auth_mchid>     
<auth_appid><![CDATA[wx7777777]]></auth_appid>     
<total_amount><![CDATA[200]]></total_amount>     
<amt_type><![CDATA[ALL_RAND]]></amt_type>     
<total_num><![CDATA[3]]></total_num>     
<wishing><![CDATA[恭喜發(fā)財 ]]></wishing>     
<act_name><![CDATA[ 新年紅包 ]]></act_name>     
<remark><![CDATA[新年紅包 ]]></remark>     
<risk_cntl><![CDATA[NORMAL]]></risk_cntl>     
<nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str>
</xml>

返回數(shù)據(jù)說明
返回格式為xml
成功示例

<xml>     
<return_code><![CDATA[SUCCESS]]></return_code>     
<return_msg><![CDATA[發(fā)放成功.]]></return_msg> 
<result_code><![CDATA[SUCCESS]]></result_code> 
<err_code><![CDATA[0]]></err_code>     
<err_code_des><![CDATA[發(fā)放成功.]]></err_code_des>     
<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno> 
<mch_id>10010404</mch_id>     
<wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>     
<sp_ticket><![CDATA[0cca98c8c8e814883]]></sp_ticket> 
<total_amount>3</total_amount>     
<detail_id><![CDATA[001001040420141117000004888]]></detail_id> 
<send_time><![CDATA[20150101080000]]></send_time> 
</xml>  

失敗示例

<xml>     
<return_code><![CDATA[FAIL]]></return_code>     
<return_msg><![CDATA[系統(tǒng)繁忙,請稍后再試.]]></return_msg>     
<result_code><![CDATA[FAIL]]></result_code>     
<err_code><![CDATA[268458547]]></err_code>     
<err_code_des><![CDATA[系統(tǒng)繁忙,請稍后再試.]]></err_code_des>     
<mch_billno><![CDATA[0010010404201411170000046542]]></mch_billno>             
<mch_id>10010404</mch_id>     
<wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid>      
<total_amount>3</total_amount> 
</xml>

根據(jù)請求參數(shù)的說明给僵,以及返回的結(jié)果,我們可以分別定義它們的傳入?yún)?shù)和傳出參數(shù),具體的紅包預(yù)下單的接口定義如下

/// <summary>
/// 紅包預(yù)下單接口帝际。需要商戶證書
/// 設(shè)置單個紅包的金額蔓同,類型等,生成紅包信息蹲诀。預(yù)下單完成后斑粱,需要在72小時內(nèi)調(diào)用jsapi完成抽紅包的操作。(紅包過期失效后脯爪,資金會退回到商戶財付通帳號则北。)
/// </summary>
/// <param name="data">傳入?yún)?shù)數(shù)據(jù)</param>
/// <returns></returns>
LotteryPreOrderResult LotteryPreOrder(LotteryPreOrderData info);

其中LotteryPreOrderResult返回的對象結(jié)果如下所示,主要的信息是要記錄sp_ticket痕慢,目前沒有通過API接口獲取已經(jīng)預(yù)下單紅包的sp_ticket信息尚揣,所以一定要先記錄好,后面在錄入紅包的時候掖举,需要使用到這個票據(jù)惑艇。

public class LotteryPreOrderResult : PayResult
{
    /// <summary>
    /// 商戶訂單號
    /// </summary>
    public string mch_billno { get; set; }
    /// <summary>
    /// 公眾賬號appid
    /// </summary>
    public string wxappid { get; set; }
    /// <summary>
    /// 總付款金額,單位分
    /// </summary>
    public int total_amount { get; set; }
    /// <summary>
    /// 一個普通紅包對應(yīng)一個ticket
    /// </summary>
    public string sp_ticket { get; set; }
    /// <summary>
    /// 紅包內(nèi)部訂單號
    /// </summary>
    public string detail_id { get; set; }
    /// <summary>
    /// 紅包發(fā)放時間 
    /// </summary>
    public string send_time { get; set; }
}

2)創(chuàng)建紅包活動
接口說明
創(chuàng)建紅包活動拇泛,設(shè)置紅包活動有效期滨巴,紅包活動開關(guān)等基本信息,返回活動id
接口調(diào)用說明

服務(wù)器端調(diào)用http請求方式: POST
URL: https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=ACCESSTOKEN&use_template=1&logo_url=”LOGO_URL”

請求參數(shù)說明
參數(shù) 類型 說明
access_token string
accesstoken,以參數(shù)的形式拼裝在url后
use_template int
是否使用模板俺叭,1:使用恭取,2:不使用,以參數(shù)的形式拼裝在url后。(模版即交互流程圖中的紅包加載頁熄守,使用模板用戶不需要點擊可自動打開紅包蜈垮;不使用模版需自行開發(fā)HTML5頁面,并在頁面調(diào)用紅包jsapi)
logo_url string
使用模板頁面的logo_url裕照,不使用模板時可不加攒发。展示在搖一搖界面的消息圖標。圖片尺寸為120x120晋南。

POST BODY:JSON格式的結(jié)構(gòu)體惠猿,具體信息不在贅述,不過值得說明的是其中的Key是需要注意的负间,這個值一定需要使用一個確定的值偶妖,因為需要和后面的抽取紅包的簽名處理一致,否則會出錯無法抽取紅包政溃。

請求示例

Content-Type: application/json Post Body:
{                                                            
 "title": "title",                           
 "desc": "desc",                             
 "onoff": 1,                                 
 "begin_time": 1428854400,                            
 "expire_time": 1428940800,                           
 "sponsor_appid": "wxxxxxxxxxxxxxx",
 "total": 10,
 "jump_url": JUMP_URL,     
 "key": "keyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"                            
}

返回數(shù)據(jù)說明
示例

{     
 "errcode":0,     
 "errmsg":"",     
 "lottery_id":"xxxxxxllllll", 
 "page_id":1, 
}

根據(jù)上面的接口定義和接口參數(shù)說明趾访,我們可以定義創(chuàng)建紅包活動的接口定義,如下所示

/// <summary>
/// 創(chuàng)建紅包活動董虱,設(shè)置紅包活動有效期扼鞋,紅包活動開關(guān)等基本信息,返回活動id
/// </summary>
/// <param name="accessToken">調(diào)用接口憑證</param>
/// <param name="useTempate">是否使用模板</param>
/// <param name="login_url">使用模板頁面的logo_url,不使用模板時可不加云头。展示在搖一搖界面的消息圖標捐友。圖片尺寸為120x120。</param>
/// <returns></returns>
AddLotterResult AddLotteryInfo(string accessToken, bool useTempate, string login_url, AddLotteryJson json);

其中AddLotteryResult為我們定義的接口處理結(jié)果盘寡,主要需要記錄其中的LotteryID,這個值需要在后面的錄入紅包接口使用到撮慨。

/// <summary>
/// 添加紅包活動的結(jié)果
/// </summary>
public class AddLotterResult : ErrorJsonResult
{
    /// <summary>
    /// 生成的紅包活動id
    /// </summary>
    public string lottery_id { get; set; }
    /// <summary>
    /// 生成的模板頁面ID  
    /// </summary>
    public int page_id { get; set; }
}

3)錄入紅包信息
在紅包預(yù)下單竿痰,以及創(chuàng)建紅包活動后,就需要把前面兩者的信息關(guān)聯(lián)起來砌溺,這個操作就是錄入紅包信息影涉,錄入紅包信息包括提交紅包活動的ID,以及紅包預(yù)下單的sp_ticket的票據(jù)信息规伐,這樣就可以讓用戶抽取具體的紅包信息了蟹倾。
接口說明
在調(diào)用"創(chuàng)建紅包活動"接口之后,調(diào)用此接口錄入紅包信息猖闪。注意鲜棠,此接口每次調(diào)用,都會向某個活動新增一批紅包信息培慌,如果紅包數(shù)少于100個豁陆,請通過一次調(diào)用添加所有紅包信息。如果紅包數(shù)大于100吵护,可以多次調(diào)用接口添加盒音。請注意確保多次錄入的紅包ticket總的數(shù)目不大于創(chuàng)建該紅包活動時設(shè)置的total值。
接口調(diào)用說明

服務(wù)器端調(diào)用http請求方式: POST
URL:https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=ACCESSTOKEN

POST BODY:JSON格式的結(jié)構(gòu)體


請求示例

Content-Type: application/json Post Body:
{     
"lottery_id": "xxxxxxllllll",     
"mchid": "10000098",     
"sponsor_appid": "wx8888888888888888"     
"prize_info_list": [         
     {            
   "ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g==",                                   
     }
   ]
}

返回數(shù)據(jù)說明
示例

{         
"errcode":0,     
"errmsg":"",     
"repeat_ticket_list":[         
     {            
"ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g==",                       
     }            
  ]     
"success_num":100 
}

根據(jù)這些接口定義和傳遞參數(shù)信息馅而,我們可以定義錄入紅包的接口祥诽。

/// <summary>
/// 錄入紅包信息
/// 在調(diào)用"創(chuàng)建紅包活動"接口之后,調(diào)用此接口錄入紅包信息瓮恭。
/// 注意雄坪,此接口每次調(diào)用,都會向某個活動新增一批紅包信息屯蹦,如果紅包數(shù)少于100個诸衔,請通過一次調(diào)用添加所有紅包信息。
/// 如果紅包數(shù)大于100颇玷,可以多次調(diào)用接口添加笨农。請注意確保多次錄入的紅包ticket總的數(shù)目不大于創(chuàng)建該紅包活動時設(shè)置的total值。
/// </summary>
/// <param name="accessToken">調(diào)用接口憑證</param>
/// <param name="json">錄入紅包信息</param>
/// <returns></returns>
SetPrizeBucketResult SetPrizeBucket(string accessToken, SetPrizeBucketJson json);

其中錄入紅包返回的結(jié)果類SetPrizeBucketResult 定義如下所示帖渠。

/// <summary>
/// 錄入紅包返回的結(jié)果
/// </summary>
public class SetPrizeBucketResult : ErrorJsonResult
{
    /// <summary>
    /// 重復(fù)使用的ticket列表谒亦,如為空,將不返回
    /// </summary>
    public List<PrizeTicket> repeat_ticket_list { get; set; }
    /// <summary>
    /// 過期的ticket列表,如為空份招,將不返回
    /// </summary>
    public List<PrizeTicket> expire_ticket_list { get; set; }
    /// <summary>
    /// 金額不在大于1元切揭,小于1000元的ticket列表,如為空锁摔,將不返回
    /// </summary>
    public List<PrizeTicket> invalid_amount_ticket_list { get; set; }
    /// <summary>
    /// 原因:生成紅包的時候廓旬,授權(quán)商戶號auth_mchid和auth_appid沒有寫搖周邊的商戶號
    /// </summary>
    public List<PrizeTicket> wrong_authmchid_ticket_list { get; set; }
    /// <summary>
    /// ticket解析失敗,可能有錯別字符或不完整    
    /// </summary>
    public List<PrizeTicket> invalid_ticket_list { get; set; }

    /// <summary>
    /// 成功錄入的紅包數(shù)量
    /// </summary>
    public int success_num { get; set; }
}

3谐腰、紅包接口的使用及JSAPI的搖一搖頁面處理

前面說明了相關(guān)的接口信息和對應(yīng)的結(jié)果類的定義孕豹,我們具體在根據(jù)相關(guān)的說明,實現(xiàn)接口的處理就可以了十气,這個小節(jié)介紹如何使用這些接口励背,實現(xiàn)我們對搖一搖紅包的整個流程的處理。

如第一步砸西,調(diào)用紅包預(yù)下單處理叶眉。

string sp_ticket = "";
/// <summary>
/// 紅包預(yù)下單,并記錄紅包的ticket信息
/// </summary>
private void btnHbPreOrder_Click(object sender, EventArgs e)
{
    LotteryPreOrderData info = new LotteryPreOrderData()
    {
        total_amount = 100,
        total_num = 1,
        act_name = "恭喜發(fā)財",
        remark = "恭喜發(fā)財",
        wishing = "恭喜發(fā)財",
    };
    var result = hbApi.LotteryPreOrder(info);
    sp_ticket = result.sp_ticket;//賦值芹枷,方便下面的錄入紅包操作
    Console.WriteLine(XmlConvertor.FormatXml(result.ToXml()));
}

第二部創(chuàng)建紅包活動衅疙,如下所示。

string lotteryId = "";
/// <summary>
/// 創(chuàng)建紅包活動鸳慈,并記錄活動的ID
/// </summary>
private void btnCreateLottery_Click(object sender, EventArgs e)
{
    AddLotteryJson json = new AddLotteryJson()
    {
        begin_time = DateTime.Now.DateTimeToInt(),
        expire_time = DateTime.Now.AddDays(90).DateTimeToInt(),
        title = "測試紅包",
        desc = "測試紅包",
        sponsor_appid = this.AppId,
        onoff = 1,
        total = 1, 
        jump_url = "http://www.iqidi.com",
        key = accountInfo.PayAPIKey
    };

    var result = hbApi.AddLotteryInfo(token, false, null, json);
    lotteryId = result.lottery_id;//賦值方便查詢紅包

    Console.WriteLine(result.ToJson());
}

第三步炼蛤,根據(jù)紅包預(yù)下單結(jié)果和紅包活動創(chuàng)建結(jié)果,錄入紅包信息

/// <summary>
/// 錄入紅包信息蝶涩,供使用搖一搖頁面處理
/// </summary>
private void btnSetHB_Click(object sender, EventArgs e)
{
    if (string.IsNullOrEmpty(sp_ticket))
    {
        MessageUtil.ShowError("紅包票據(jù)ticket為空");
        return;
    }

    SetPrizeBucketJson json = new SetPrizeBucketJson()
    {
        lottery_id = lotteryId, //使用前面的紅包活動
        mchid = accountInfo.MchID,
        sponsor_appid = accountInfo.AppID,
        prize_info_list = new List<PrizeTicket>()
        {
            new PrizeTicket() { ticket = sp_ticket},//使用前面的紅包預(yù)下單ticket
        }
    };
    var result = hbApi.SetPrizeBucket(this.token, json);
    Console.WriteLine("錄入紅包的結(jié)果:");
    Console.WriteLine(result.ToJson());
}

第四步理朋,配置好重定向的頁面,方便獲取用戶的openid
1)用戶同意授權(quán)绿聘,獲取code
這個步驟嗽上,我們利用的是“網(wǎng)頁授權(quán)獲取用戶基本信息”操作,其中相關(guān)的信息說明如下所示熄攘。
在確保微信公眾賬號擁有授權(quán)作用域(scope參數(shù))的權(quán)限的前提下(服務(wù)號獲得高級接口后兽愤,默認擁有scope參數(shù)中的snsapi_base和snsapi_userinfo),引導關(guān)注者打開如下頁面:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect若提示“該鏈接無法訪問”挪圾,請檢查參數(shù)是否填寫錯誤浅萧,是否擁有scope參數(shù)對應(yīng)的授權(quán)作用域權(quán)限。

尤其注意:由于授權(quán)操作安全等級較高哲思,所以在發(fā)起授權(quán)請求時洼畅,微信會對授權(quán)鏈接做正則強匹配校驗,如果鏈接的參數(shù)順序不對棚赔,授權(quán)頁面將無法正常訪問帝簇。

參考鏈接(請在微信客戶端中打開此鏈接體驗)
Scope為snsapi_base
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
Scope為snsapi_userinfo
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

尤其注意:跳轉(zhuǎn)回調(diào)redirect_uri徘郭,應(yīng)當使用https鏈接來確保授權(quán)code的安全性。
這樣丧肴,如果我們配置的連接為http://www.iqidi.com/JSSDKTest/RedPack?uid=iqidiSoftware 残揉,其中uid為我們對應(yīng)的賬號名稱。
那么我們根據(jù)上面規(guī)則芋浮,得到重定向的連接地址就是如下所示抱环。

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx3d81fc2886d86526&redirect_uri=http%3a%2f%2fwww.iqidi.com%2fJSSDKTest%2fRedPack%3fuid%3diqidiSoftware&response_type=code&scope=snsapi_base&state=state#wechat_redirect

2)通過code換取網(wǎng)頁授權(quán)access_token
首先請注意,這里通過code換取的是一個特殊的網(wǎng)頁授權(quán)access_token,與基礎(chǔ)支持中的access_token(該access_token用于調(diào)用其他接口)不同纸巷。公眾號可通過下述接口來獲取網(wǎng)頁授權(quán)access_token镇草。如果網(wǎng)頁授權(quán)的作用域為snsapi_base,則本步驟中獲取到網(wǎng)頁授權(quán)access_token的同時何暇,也獲取到了openid陶夜,snsapi_base式的網(wǎng)頁授權(quán)流程即到此為止凛驮。
尤其注意:由于公眾號的secret和獲取到的access_token安全級別都非常高裆站,必須只保存在服務(wù)器,不允許傳給客戶端黔夭。后續(xù)刷新access_token宏胯、通過access_token獲取用戶信息等步驟,也必須從服務(wù)器發(fā)起本姥。
請求方法
獲取code后肩袍,請求以下鏈接獲取access_token:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
參數(shù)說明


在具體的頁面里面,我們可以獲得相關(guān)的參數(shù)婚惫,如uid我們可以把它轉(zhuǎn)換為我們對應(yīng)的賬號信息氛赐,如下所示。

/// <summary>
/// 根據(jù)賬號名獲取對應(yīng)的對象
/// </summary>
/// <returns></returns>
private AccountInfo GetAccount()
{
    AccountInfo accountInfo = null;
    string accountNo = Request.QueryString["uid"];
    if (!string.IsNullOrEmpty(accountNo))
    {
        accountInfo = BLLFactory<Account>.Instance.FindByAccountNo(accountNo);
    }
    return accountInfo;
}

而其中的code先舷,我們根據(jù)這個信息艰管,也可以獲得用戶的相關(guān)信息,我們需要獲得訪問用戶的openid蒋川,如下所示牲芋。

string code = Request.QueryString["code"];
IBasicApi baseApi = new BasicApi();
var result = baseApi.GetAuthToken(accountInfo.UniteAppId, accountInfo.UniteAppSecret, code);
if (result != null && !string.IsNullOrEmpty(result.openid))
{
    var openid = result.openid;

有了這些信息,我們就可以構(gòu)建我們的紅包參數(shù)捺球,并封裝好簽名了缸浦。

WxPayData data = new WxPayData();
data.SetValue("openid", openid);
data.SetValue("lottery_id", lottery_id);
data.SetValue("noncestr", data.GenerateNonceStr());
data.SetValue("sign", data.MakeSign(accountInfo.PayAPIKey));

然后,我們在后臺氮兵,把這些信息賦值給ViewBag裂逐,就可以在頁面上順利使用了。

var sign = data.GetString("sign");//獲取生成的sign
var noncestr = data.GetString("noncestr");//獲取生成的sign

ViewBag.sign = sign;
ViewBag.lottery_id = lottery_id;
ViewBag.openid = openid;
ViewBag.noncestr2 = noncestr;

在搖一搖紅包的處理視圖頁面里面泣栈,我們先引入對應(yīng)的js文件絮姆,如下所示

<title>搖一搖紅包頁面</title>
<link rel="stylesheet" >
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>
<script type="text/javascript" src="http://zb.weixin.qq.com/app/shakehb/BeaconShakehbJsBridge.js"></script>

然后在JS里面添加相關(guān)的處理函數(shù)醉冤,并賦值給對應(yīng)的接口參數(shù)。

<script type="text/javascript">
BeaconShakehbJsBridge.ready(function () {
    //跳轉(zhuǎn)到抽紅包頁面
    BeaconShakehbJsBridge.invoke('jumpHongbao', {
        lottery_id: '@ViewBag.lottery_id',
        noncestr: '@ViewBag.noncestr2',
        openid: '@ViewBag.openid',
        sign: '@ViewBag.sign'
    });
});
</script>

最后篙悯,我們測試相關(guān)的結(jié)果蚁阳,使用手機搖一搖獲得紅包的過程界面效果如下所示。



如果對這個《C#開發(fā)微信門戶及應(yīng)用》系列感興趣鸽照,可以關(guān)注我的其他文章.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末螺捐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子矮燎,更是在濱河造成了極大的恐慌定血,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诞外,死亡現(xiàn)場離奇詭異澜沟,居然都是意外死亡,警方通過查閱死者的電腦和手機峡谊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門茫虽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人既们,你說我怎么就攤上這事濒析。” “怎么了啥纸?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵号杏,是天一觀的道長。 經(jīng)常有香客問我斯棒,道長盾致,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任荣暮,我火速辦了婚禮庭惜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘渠驼。我一直安慰自己蜈块,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布迷扇。 她就那樣靜靜地躺著百揭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜓席。 梳的紋絲不亂的頭發(fā)上器一,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音厨内,去河邊找鬼祈秕。 笑死渺贤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的请毛。 我是一名探鬼主播志鞍,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼方仿!你這毒婦竟也來了固棚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤仙蚜,失蹤者是張志新(化名)和其女友劉穎此洲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體委粉,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡呜师,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贾节。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汁汗。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氮双,靈堂內(nèi)的尸體忽然破棺而出碰酝,到底是詐尸還是另有隱情霎匈,我是刑警寧澤戴差,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站铛嘱,受9級特大地震影響暖释,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜墨吓,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一球匕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帖烘,春花似錦亮曹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乡摹,卻和暖如春役耕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聪廉。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工瞬痘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留故慈,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓框全,卻偏偏與公主長得像察绷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子津辩,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容