前言:
最近在開發一個商業街區的聚合掃碼支付功能,其中需要用到的有支付寶,微信兩種支付方式,當然對于開發微信支付而已作為自己的老本行已經比較熟悉了,然而對于我來說支付寶支付還是頭一次涉及到。這次項目中需要用到的是支付寶公衆号支付這一功能,因為需要進行支付寶授權擷取到使用者的User_ID然後在進行支付寶公衆号支付,在這裡我就順帶把使用者資訊也擷取了。因為第一次玩,大概配置支付寶開發平台的應用資訊到擷取到使用者User_ID遇到了幾個坑,今天記錄一下希望能夠幫助一下沒有做個這樣方面的同仁哪些的方有坑,并且加深一下自己的印象,最後我要聲明一下我所開發語言是.net mvc 非JAVA,因為這裡java和非java的秘鑰生成的秘鑰格式有所不同。
第一步:登入支付寶開放平台,注冊開發者,建立應用添加所需功能和配置應用資訊:
登入位址:https://openhome.alipay.com/
建立應用:點選開發者中心>建立一個應用>擷取拿到對應應用的appid(後期程式中會用到)
添加對應功能:因為我在這裡隻需要使用到擷取會員資訊授權的功能,是以添加(擷取會員資訊的功能即可),如下圖所示:
應用資訊配置,這裡最為主要的還是RSA(SHA256)密鑰生成,有坑需注意:
在應用資訊配置的時候我們需要配置:應用網關(沒有時不需要配置),授權回調位址,加簽方式(RSA(SHA256)密鑰)
這裡主要講的是RSA(SHA256秘鑰生成):在這裡首先我們下載下傳秘鑰生成工具使用這個最後,可視化(window系統的使用者)
下載下傳位址:https://docs.open.alipay.com/291/105971
秘鑰生成指導視訊:https://openclub.alipay.com/index.php?c=read&a=video&fid=76&tid=3699
下載下傳完成後我們需要打開工具,這裡還要強調一下因為我是.Net MVC,是以我們要選擇的Rsa秘鑰格式為:PKCS1(非Java适用),秘鑰長度選擇2048(因為支付寶配置所需的是RSA256,假如是RSA的話适用1024即可),如下圖所示:
第二步:适用.Net MVC 實作支付寶網頁授權代碼(功能可以,已在開發環境适用此代碼):
了解支付寶授權的流程:
如上圖所示,需要拿取到使用者資訊需要分四步走:
1、拼接授權回調位址
2、擷取Auth_Code(授權碼)
3、通過Auth_Code換取接口access_token及其使用者user_id
4、調用接口擷取使用者資訊
代碼實作:
在寫代碼之前,先下載下傳 AopSdk.dll (我編譯,生産的SDK)阿裡已經給我們寫好了所需的方法我們隻需調用其類型,傳遞參數即可。
阿裡未編譯的SDK下載下傳位址:https://docs.open.alipay.com/54/103419
猛料來了,業務邏輯實作:
#region 支付寶網頁授權擷取userid
/// <summary>
///支付寶授權登入
/// </summary>
/// <param name="Sid">店鋪編号</param>
/// <returns></returns>
public ActionResult SupplierAliPay()
{
try
{
string ReturnUrl = "";//第一步:擷取auth_code接口拼接
var admins = new admins { Id = 1 }.SelectObject();
string AliRedirect_url ="擷取回調位址";//http請求格式必須與公衆平台配置的一緻
//注意假如你需要擷取到使用者的新的的話SCOPe類型使用auth_userinfo,而我在支付那裡使用的是auth_base這樣不需要使用者授權,可以讓使用者絲毫沒有感覺,體驗性好
ReturnUrl = "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=" +應用APPid+ "&scope=auth_base&state=" + 自定義參數(非必填)+ "&redirect_uri=" + Url.Encode(AliRedirect_url) + "";return Redirect(ReturnUrl);
}
catch (Exception ex)
{
return View();
}
}
/// <summary>
///擷取使用者buyer_id調轉AliPaypage擷取支付寶賬号的userid (授權回調)
/// </summary>
/// <param name="auth_code"></param>
/// <param name="state"></param>
/// <returns></returns>
public ActionResult GetUserAliUserID(string auth_code, string state)
{
try
{
auth_code= Request.QueryString["auth_code"];//授權碼
state = Request.QueryString["state"];
string AliAppid="";//支付寶應用Appid
string Userid = "";//支付寶使用者唯一編号//應用私鑰
string YOUR_PRIVATE_KEY= "";
//支付寶公鑰
string ALIPAY_PUBLIC_KEY = "";
Aop.Api.IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do",AliAppid, YOUR_PRIVATE_KEY, "json", "1.0", "RSA2", ALIPAY_PUBLIC_KEY, "GBK", false);
//擷取access_token
AlipaySystemOauthTokenRequest requestAccess_token = new AlipaySystemOauthTokenRequest();
requestAccess_token.GrantType = "authorization_code";
requestAccess_token.Code = auth_code;
AlipaySystemOauthTokenResponse responseAccess_token = client.Execute(requestAccess_token);
Userid = responseAccess_token.UserId;//支付寶使用者的唯一userId //responseAccess_token.AlipayUserId;使用者的open_id( 已廢棄,請勿使用 )
//擷取使用者資訊,通過access_token調用使用者資訊共享接口擷取使用者資訊
AlipayUserInfoShareRequest requestUserinfo = new AlipayUserInfoShareRequest();
AlipayUserInfoShareResponse responseUserinfo = client.Execute(requestUserinfo, responseAccess_token.AccessToken);
string UserName = responseUserinfo.NickName;//昵稱
string Address = responseUserinfo.City;//所屬城市
string UserImage= responseUserinfo.Avatar;//使用者頭像
string gender = responseUserinfo.Gender;//M為男性,F為女性, 如果沒有資料的時候不會傳回該資料,請做好容錯
return Redirect("/mobile_user/HstyAliPayPayment/AliPayPage?Sid="+Sid+ "&buyer_id="+Userid+"");
}
catch (Exception ex)
{
return view();
}
}
#endregion
第三步:所遇問題,及其解決方案:
支付寶接口錯誤:您使用的私鑰格式錯誤,請檢查RSA私鑰配置,charset = utf-8
解決方法:
在代碼DefaultAopClient("https://openapi.alipay.com/gateway.do",AliAppid, YOUR_PRIVATE_KEY, "json", "1.0", "RSA2", ALIPAY_PUBLIC_KEY, "GBK", false);
最後一個參數需要設定為 false(自定義屬性keyFromFile=false),如果設定為true時必須必須得傳入pem的實體路徑,讀取.pem檔案中的資料,如:HttpRuntime.AppDomainAppPath.ToString() + "App_Data\ant\rsa_private_key.pem"
JAVAsign check fail: check Sign and Data Fail! (簽名格式有誤)
這就是我之前所說的秘鑰生成格式應該為kpcs1(非java适用),假如你已經生成了java适用的莫慌不需要重新生成,在這個秘鑰生成工具中有kpcs8轉化為kpcs1的功能,轉換過來就好了
總結:
其實做第三方對接開發的時候我們第一要做的是讀懂文檔,熟悉開發流程,流程不清晰可能導緻程式設計推翻重做,有的時候往往一個空格一個字母問題可以讓你找上一天,是以做任何事情我們都要細心、仔細、認真。
作者:追逐時光者
作者簡介:一個熱愛程式設計,善于分享,喜歡學習、探索、嘗試新事物,新技術的程式猿。
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果該篇文章對您有幫助的話,可以點一下右下角的【♥推薦♥】,希望能夠持續的為大家帶來好的技術文章,文中可能存在描述不正确或錯誤的地方,歡迎指正、補充,不勝感激 !