A. 微信公眾號的用戶綁定怎麼實現的
用OpenID綁定即可
微信介面中雖然沒給用戶的微信賬號,但給了用戶的OpenID,這個OpenID對一個公眾號是唯一的,測試也證明不會改變,也就是說同一個微信號和同一個公眾號交互,我們得到的OpenID是不會變的,因此,可以用OpenID作為微信用戶的身份標識。
如何綁定
俗話說,沒吃過豬肉還沒見過豬跑。看招行信用卡公眾號是如何做的,在微信裡面給用戶一個驗證鏈接,用戶點擊鏈接,微信會用內嵌的瀏覽器打開這個鏈接,然後就是一般的網頁登錄驗證界面,我們通過HTTP(S)獲取用戶輸入的系統用戶名與密碼,驗證通過後完成綁定。 具體如何生成鏈接和如何傳遞OpenID下面詳述。
如何生成綁定鏈接
綁定涉及到用戶的身份甚至利益,所以需要注意安全性。我們需要綁定的是OpenID和系統用戶,系統用戶名是用戶直接在鏈接頁面輸入後通過 HTTP(S)傳給我們的,這沒有問題。OpenID對用戶來說透明,用戶不會傳給我們,我們也只有在用戶在微信中向公眾號發消息時才可獲得 OpenID,所以很明顯,OpenID需要包含在生成的鏈接中,至於需不需要對OpenID作加密就看你自己了,我覺得這不重要,更為重要的是要在鏈接 中帶上簽名和加上時間戳。因為我們需要確認這個鏈接是由我們服務端生成的,用戶自己或者其他人不能夠偽造出這個鏈接,加上時間戳是為了給這個鏈接一個過期 時間,如果不限制過期時間,假設用戶綁定後這個鏈接通過某種方式被別人知道,那麼這個人就可以把自己的賬號與用戶的微信號綁定。所以我採取的方法是用 OpenID、過期時間再加上一個密鑰生成簽名,生成簽名的方法和微信伺服器介面驗證時的簽名方法類似(密鑰最好另選一個只有自己知道的)。
如何傳遞OpenID
有了綁定鏈接,用戶點了綁定鏈接,但這只是第一步,第二步我們需要在用戶在鏈接頁面提交登錄請求後進行驗證,OpenID怎麼傳到第二步中呢?有人 說了,這還不簡單,在登錄表單中加一個隱藏域放用戶的OpenID一起提交給驗證的Handler不就OK了,那我只能說很遺憾,你前面所做的安全工作都 白費了,一旦A用戶的OpenID泄漏,B用戶就可以把自己的賬號與A用戶的微信號綁定了。所以永遠不要相信客戶端提交的東西。我的方法是當用戶點擊生成 鏈接後,在鏈接頁載入時,將OpenID存到session中,因為這個session是沒法偽造的(cookie被盜除外),所以只有點擊這個鏈接的用 戶的session中才會有鏈接中包含的OpenID。
B. openld是什麼意思
OpenID 是一個以用戶為中心的數字身份識別框架,它具有開放、分散性。OpenID 的創建基於這樣一個概念:我們可以通過 URI (又叫 URL 或網站地址)來認證一個網站的唯一身份,同理,也可以通過這種方式來作為用戶的身份認證。
OpenID 系統的第一部分是身份驗證,即如何通過URI來認證用戶身份。目前的網站都是依靠用戶名和密碼來登錄認證,這就意味著大家在每個網站都需要注冊用戶名和密碼,即便你使用的是同樣的密碼。
(2)openid生成演算法擴展閱讀
口令方式:
當自己每天訪問自己的電子郵件伺服器、利用Telnet登錄大學或公司的計算機或者訪問互聯網上諸如E*Trade的訂閱服務時都在使用口令。伺服器要採用用戶名與口令對用戶進行認證的話,就必須維護合法用戶的用戶名與口令的資料庫。
口令的選擇應滿足的幾個原則:
1、容易記憶;不易猜中;不易分析。
2、口令管理可通過單項函數來解決,即計算機不存儲口令,只存儲口令的單項函數,其識別過程如下:
1)用戶將口令傳送給計算機;
2) 計算機完成口令單向函數值的計算。
3)計算機把單向函數值和機器存儲值比較。
許多WWW伺服器系統都用固定格式的文件來存儲用戶名和口令,避免專門建立一個資料庫系統來僅僅存儲用戶名或口令。對大的商務網站來說,不可能將用戶名和口令存儲在固定格式文件中。
這些大網站一般會用工業級的資料庫來存儲商品目錄,而用同樣的資料庫來存儲用戶名和口令就很有意義了。否則,成千上萬的顧客要同時登錄會帶來很大的延遲。
不管將登錄信息存儲在何處。最常見也是最安全的存儲方法(UNIX系統採用的方法)是以明文形式保存用戶名,而用加密方式來保存口令。在系統創建一組新的用戶名/口令時,一般採用單向加密演算法對口令進行加密(同前面講述的消息摘要演算法一樣)。
在明文的用戶名和加密的口令方式下,當用戶登錄時,系統根據資料庫中所存儲的用戶名清單來檢查用戶名以驗證用戶的合法身法。對登錄系統時用戶所輸入的口令進行加密,系統將用戶口令的加密結果同資料庫中所存儲的加密口令進行比較。
如果指定用戶的兩種加密口令相互匹配,就接受登錄。這就是UNIX操作系統上即使系統管理員也無法找到被遺忘口令的原因。這時,管理員會給你一個新的臨時口令,然後你可改成自己選定的口令。
要知道口令是不安全的。有的網站將用戶名/口令以Cookie形式存在客戶機上,以方便用戶以後再訪問網站時不用再輸入用戶名/口令就能直接登錄了。
Cookie存在的問題是信息是以明文形式存在客戶機上,如果Cookie內含登錄和口令信息,任何想訪問存儲在客戶機上Cookie人都能看到這些信息。
C. 微信用戶怎麼生成 openid
1、在手機上打開微信 2、我們選擇微信裡面菜單下的最後一項「我」 3、我們在點擊自己的頭像 4、在這裡面我們看到一個二維碼名片 5、我們點擊二維碼名片;就會自動生成個人二維碼了 6、我們可以點擊右上角的省略號;在下面我們可以換二維碼樣式 7、好了我們選擇:右上角的省略號下的保存二維碼或者分享 8、我們保存的二維碼;可以直接發給別人 或者掛在網站上;讓別人掃描:
D. 一直沒明白小程序的openid是什麼作用是啥
全球每個國家裡面的每個公民都有一個身份證號,一個個國家就類似一個個小程序,每個用戶進入一個小程序就會分配一個openid,類似於身份證號,用於唯一身份識別的標識。
E. php 小白。請問高手怎麼生成如下的代碼,微信openid list
這是json格式 一般是把一個索引數組變成json格式 用 json_encode 在php頁面用 json_decode 反解碼 就出來 原數組了
F. 微信服務號openid可以偽造嗎
openid是公眾號的普通用戶的一個唯一的標識,只針對當前的公眾號有效的,偽造沒有實際意義,它是微信用來區分用戶的數值。這個值是在注冊微信公眾號系統就已經分配好的,後期是沒法更改的。通常還配合對應的密鑰來對接數據的,偽造不了的。
G. 微信移動支付時用官方給的例子嗎
微信支付jsapi(java版),具體代碼如下:
代碼太多,更多代碼請訪問http://www.vxzsk.com/394.html
1.項目使用springmvcrestful風格的,需要用到jar包請自行下載
2.整個項目只需要修改com.tenpay.configure.WxPayConfig中的配置信息就行。
//appid
publicstaticStringAPP_ID="公眾id";
//JSAPI介面中獲取openid,審核後在公眾平台開啟開發模式後可查看
publicstaticStringAPP_SECRET="公眾號中的秘鑰";
//受理商ID,身份標識
publicstaticStringMCH_ID="商戶id";
//商戶支付密鑰Key,裝完整數後,配置得到。32位長度
publicstaticStringKEY="商戶平台中配置證書,設置的秘鑰";
//非同步回調地址
publicstaticStringNOTIFY_URL="支付成功後的回調action";
publicstaticStringCHARTSET="UTF-8";
//加密方式
publicstaticStringSIGN_TYPE="MD5";
//redirect_uri,微信授權重定向地址
publicstaticStringREDIRECT_URI;
static{
try{
REDIRECT_URI=URLEncoder.encode("微信授權成功後重定向的action",CHARTSET);
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}
}
3.項目核心類com.tenpay.action.WxPayAction
pay函數:支付前准備函數,從資料庫獲取訂單號,查詢訂單金額,訂單描述、openid、prepay_id等等。
notify函數:支付成功後非同步回調函數。
一、新建基於springMVC框架的javaweb項目名字為wxPay
packagecom.tenpay.action;
importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.UnsupportedEncodingException;
importjava.util.Map;
importjava.util.SortedMap;
importjava.util.TreeMap;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.jdom2.JDOMException;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.RequestMapping;
importcom.tenpay.RequestHandler;
importcom.tenpay.configure.WxPayConfig;
importcom.tenpay.service.ServiceUtil;
importcom.tenpay.util.MD5Util;
importcom.tenpay.util.Sha1Util;
importcom.tenpay.util.XMLUtil;
importnet.sf.json.JSONObject;
/*******************************************************************************
*<b>類名:WxPayAction.java</b><br/>
*功能:微信支付,調用jsapi<br/>
*日期:<br/>
*
*@authorV型知識庫www.vxzsk.com
*@version1.0
*
******************************************************************************/
@Controller
@RequestMapping("/v_3")
publicclassWxPayAction{
/**
*微信客戶端授權成功後根據redirect_uri參數調整到pay介面,去准備支付前信息介面
*@paramrequest
*@paramresponse
*@return
*@throwsException
*/
@RequestMapping("pay")
publicStringorder(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{
/**
*第一步:用戶同意授權,根據參數,獲取code
*授權成功後返回的授權碼,參考:http://mp.weixin.qq.com/wiki/17/.html#.E7.AC.AC.E4.B8.80.E6.AD.A5.EF.BC.9A.E7.94.A8.E6.88.B7.E5.90.8C.E6.84.8F.E6.8E.88.E6.9D.83.EF.BC.8C.E8.8E.B7.E5.8F.96code
*/
Stringcode=request.getParameter("code");
Stringstate=request.getParameter("state");
//state可以為任何含義,根據你前端需求,這里暫時叫商品id
//授權碼、商品id
System.out.println("code="+code+",state="+state);
/**
*第二步:通過code換取網頁授權access_token
*根據授權碼code獲取access_token,參考:http://mp.weixin.qq.com/wiki/17/.html#.E7.AC.AC.E4.BA.8C.E6.AD.A5.EF.BC.9A.E9.80.9A.E8.BF.87code.E6.8D.A2.E5.8F.96.E7.BD.91.E9.A1.B5.E6.8E.88.E6.9D.83access_token
*/
//下面就到了獲取openid,這個代表用戶id.
//獲取openID
Stringopenid=ServiceUtil.getOpenId(code);
//生成隨機字元串
Stringnoncestr=Sha1Util.getNonceStr();
//生成1970年到現在的秒數.
Stringtimestamp=Sha1Util.getTimeStamp();
//訂單號,自定義生成規則,只要全局唯一就OK
Stringout_trade_no="NO"+System.currentTimeMillis()+"0001";
//訂單金額,應該是根據state(商品id)從資料庫中查詢出來
Stringorder_price=String.valueOf(1);
//商品描述,應該是根據state(商品id)從資料庫中查詢出來
Stringbody="商品描述,測試....";
/**
*第三步:統一下單介面
*需要第二步生成的openid,參考:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
*/
RequestHandlerreqHandler=newRequestHandler(request,response);
//初始化RequestHandler類可以在微信的文檔中找到.還有相關工具類
reqHandler.init();
//執行統一下單介面獲得預支付id,一下是必填參數
//微信分配的公眾賬號ID(企業號corpid即為此appId)
reqHandler.setParameter("appid",WxPayConfig.APP_ID);
//微信支付分配的商戶號
reqHandler.setParameter("mch_id",WxPayConfig.MCH_ID);
//終端設備號(門店號或收銀設備ID),注意:PC網頁或公眾號內支付請傳"WEB"
reqHandler.setParameter("device_info","WEB");
//隨機字元串,不長於32位。推薦隨機數生成演算法
reqHandler.setParameter("nonce_str",noncestr);
//商品描述
reqHandler.setParameter("body",body);
//商家訂單號
reqHandler.setParameter("out_trade_no",out_trade_no);
//商品金額,以分為單位
reqHandler.setParameter("total_fee",order_price);
//APP和網頁支付提交用戶端ip,Native支付填調用微信支付API的機器IP。
reqHandler.setParameter("spbill_create_ip","123.57.58.123");
//下面的notify_url是用戶支付成功後為微信調用的action非同步回調.
reqHandler.setParameter("notify_url",WxPayConfig.NOTIFY_URL);
//交易類型,取值如下:JSAPI,NATIVE,APP,詳細說明見參數規定
reqHandler.setParameter("trade_type","JSAPI");
//------------需要進行用戶授權獲取用戶openid-------------
reqHandler.setParameter("openid",openid);//這個必填.
/*
*<xml><appid>wx2421b1c4370ec43b</appid><attach>支付測試</attach><body>
*JSAPI支付測試</body><mch_id>10000100</mch_id><nonce_str>
*</nonce_str><notify_url>http://wxpay.
*weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url><openid>
*oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid><out_trade_no>1415659990</
*out_trade_no><spbill_create_ip>14.23.150.211</spbill_create_ip><
*total_fee>1</total_fee><trade_type>JSAPI</trade_type><sign>
*</sign></xml>
*/
//生成簽名,並且轉為xml
StringrequestXml=reqHandler.getRequestXml();
System.out.println("requestXml:"+requestXml);
//得到的預支付id
Stringprepay_id=ServiceUtil.unifiedorder(requestXml);
SortedMap<String,String>params=newTreeMap<String,String>();
params.put("appId",WxPayConfig.APP_ID);
params.put("timeStamp",timestamp);
params.put("nonceStr",noncestr);
params.put("package","prepay_id="+prepay_id);
params.put("signType","MD5");
System.out.println("params:"+JSONObject.fromObject(params).toString());
//生成支付簽名,這個簽名給微信支付的調用使用
SortedMap<Object,Object>signMap=newTreeMap<Object,Object>();
signMap.put("appId",WxPayConfig.APP_ID);
signMap.put("timeStamp",timestamp);
signMap.put("nonceStr",noncestr);
signMap.put("package","prepay_id="+prepay_id);
signMap.put("signType","MD5");
//微信支付簽名
StringpaySign=MD5Util.createSign(signMap,WxPayConfig.KEY);
System.out.println("PaySIGN:"+paySign);
//微信分配的公眾賬號ID(企業號corpid即為此appId)
request.setAttribute("appId",WxPayConfig.APP_ID);
//時間戳
request.setAttribute("timeStamp",timestamp);
//隨機字元串
request.setAttribute("nonceStr",noncestr);
//預支付id,就這樣的格式
request.setAttribute("package","prepay_id="+prepay_id);
//加密格式
request.setAttribute("signType",WxPayConfig.SIGN_TYPE);
//微信支付簽名
request.setAttribute("paySign",paySign);
return"pay";
}
/**
*非同步返回
*/
@RequestMapping("notify")
publicStringnotify(HttpServletRequestrequest,HttpServletResponseresponse){
try{
InputStreaminStream=request.getInputStream();
ByteArrayOutputStreamoutSteam=newByteArrayOutputStream();
byte[]buffer=newbyte[1024];
intlen=0;
while((len=inStream.read(buffer))!=-1){
outSteam.write(buffer,0,len);
}
outSteam.close();
inStream.close();
StringresultStr=newString(outSteam.toByteArray(),WxPayConfig.CHARTSET);
Map<String,String>resultMap=XMLUtil.doXMLParse(resultStr);
System.out.println("微信回調結果:"+resultMap.toString());
Stringresult_code=resultMap.get("result_code");
Stringis_subscribe=resultMap.get("is_subscribe");
Stringout_trade_no=resultMap.get("out_trade_no");
Stringtransaction_id=resultMap.get("transaction_id");
Stringsign=resultMap.get("sign");
Stringtime_end=resultMap.get("time_end");
Stringbank_type=resultMap.get("bank_type");
Stringreturn_code=resultMap.get("return_code");
//簽名驗證
//GenericValueuserLogin=delegator.findOne("UserLogin",UtilMisc.toMap("userLoginId","admin"),false);
if(return_code.equals("SUCCESS")){
//此處就是你的邏輯代碼
//修改資料庫支付狀態
}
request.setAttribute("out_trade_no",out_trade_no);
//通知微信.非同步確認成功.必寫.不然會一直通知後台.八次之後就認為交易失敗了.
response.getWriter().write(RequestHandler.setXML("SUCCESS",""));
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(JDOMExceptione){
e.printStackTrace();
}
return"notify";
}
}
H. 小程序unionid和openid有什麼區別
openid是表示用戶在你的當前應用中的唯一標示,多個應用,同一個用戶的openId可能並不相同。同一用戶,對同一個微信開放平台下的不同應用,unionid是相同的
1:微信小程序為什麼會有OpenID,其實在微信小程序裡面OpenID,就代表著我們一個人,擁有一個身份證一樣的東西,在我們不知道某個人的情況下,可通過OpenID來進行查詢某個用戶,當然OpenID不是我們自己生成的,而是前端通過微信提供的API wx.login(謝謝你對我們的支持,希望我的回答能有所作用,歡迎追問,再次表示感謝!)得到一個code,再拿這個code去調用我們自己後台的介面,後台再獲得到這個code再去調用微信的方法,獲取到sessionKey,OpenID,就是這么簡單。
2:小程序裡面unionID的作用,其實unionID和OpenID在本質上是沒有任何區別的,但是如果一個在同一個公眾號下面使用多個小程序(注意必須是在同一主體公眾號下面綁定的小程序)的時候,這時候OpenID將會是不一樣的,此時此刻將會用到unionID,因為unionID只要是在同一主體下面,unionID這個值永遠是一樣的,可以用來判斷是否為同一個人,當然如何獲取unionID,獲取unionID的方式和OpenID的方式是不一樣的請看以下步驟:1、用戶授權之後調用wx.getUserInfo(謝謝你對我們的支持,希望我的回答能有所作用,歡迎追問,再次表示感謝!),
在學小程序嗎?看看傳智的視頻吧,你有有所收獲的!
I. 詳解微信公眾平台UnionID和OpenID的區別
OpenID: 普通用戶的標識,對當前開發者帳號唯一。一個openid對應一個公眾號。
UnionID :用戶統一標識。針對一個微信開放平台帳號下的應用,同一用戶的unionid是唯一的。