最近在開發一個商業街區的聚合掃碼支付功能,其中須要用到的有支付寶,微信兩種支付方式,固然對於開發微信支付而已做爲本身的老本行已經比較熟悉了,然而對於我來講支付寶支付仍是頭一次涉及到。此次項目中須要用到的是支付寶公衆號支付這一功能,由於須要進行支付寶受權獲取到用戶的User_ID而後在進行支付寶公衆號支付,在這裏我就順帶把用戶信息也獲取了。由於第一次玩,大概配置支付寶開發平臺的應用信息到獲取到用戶User_ID遇到了幾個坑,今天記錄一下但願可以幫助一下沒有作個這樣方面的同仁哪些的方有坑,而且加深一下本身的印象,最後我要聲明一下我所開發語言是.net mvc 非JAVA,由於這裏java和非java的祕鑰生成的祕鑰格式有所不一樣。php
在應用信息配置的時候咱們須要配置:應用網管(沒有時不須要配置),受權回調地址,加簽方式(RSA(SHA256)密鑰)java
這裏主要講的是RSA(SHA256祕鑰生成):在這裏首先咱們下載祕鑰生成工具使用這個最後,可視化(window系統的用戶)json
下載地址:https://docs.open.alipay.com/291/105971api
祕鑰生成指導視頻:https://openclub.alipay.com/index.php?c=read&a=video&fid=76&tid=3699微信
下載完成後咱們須要打開工具,這裏還要強調一下由於我是.Net MVC,因此咱們要選擇的Rsa祕鑰格式爲:PKCS1(非Java適用),祕鑰長度選擇2048(由於支付寶配置所需的是RSA256,假如是RSA的話適用1024便可),以下圖所示:mvc
一、拼接受權回調地址app
二、獲取Auth_Code(受權碼)ide
三、經過Auth_Code換取接口access_token及其用戶user_id工具
四、調用接口獲取用戶信息微信支付
在寫代碼以前,先下載 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
在代碼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"
這就是我以前所說的祕鑰生成格式應該爲kpcs1(非java適用),假如你已經生成了java適用的莫慌不須要從新生成,在這個祕鑰生成工具中有kpcs8轉化爲kpcs1的功能,轉換過來就行了
其實作第三方對接開發的時候咱們第一要作的是讀懂文檔,熟悉開發流程,流程不清晰可能致使程序設計推翻重作,有的時候每每一個空格一個字母問題可讓你找上一天,因此作任何事情咱們都要細心、仔細、認真。