近期幫朋友做了幾個用到微信公眾號接口的活,所以總結下。
一、微信公眾號后台配置
公眾號分訂閱號,服務號,企業號,可以調用的接口權限各不相同,這里就不贅述,參考官方說明。
- 登陸公眾號后台,有接口權限,做為開發人員在開發前一定要先確認是否有接口權限。
- 白名單配置:調用接口的服務器必須要在公眾號后台把服務器ip配置進去,否則調用接口失敗。 ->
基本設置
->白名單配置
- 獲取開發者id和密碼,也就是
appid
,AppSecret
,這2個調用接口必須的參數。 - 如果用當網頁相關的接口,需要配置域名,在
設置
->公眾號設置
->功能設置
里有域名相關的配置,如果不配置相關域名,會提示簽名錯誤,並且使用未綁定微信公眾號的域名,在微信打開會有微信給的不安全提示,很惡心。 - 如果需要對接微信自動回復,按鈕事件,就需要在
基本設置
->服務器配置
里配置接收微信請求的地址。
實際上開發時生產用的公眾號是不允許用來調試接口,所以微信公眾號提供了
微信測試號
。公眾號后台
->公眾平台測試帳號
-> 按照指示,就可以擁有所有接口權限的測試號。
二. 開發
1. 選擇一個sdk或自己開發一個sdk
Software Development Kit 簡稱 SDK,這里指的sdk就是封裝了微信公眾號api的代碼包。
也許是因為網上太多的開源的微信sdk,所以至今沒有官方出的微信公眾號的sdk。so,為了簡化開發,我們可以直接網上找個開源的sdk,例如 fastweixin,jfinal-weixin,基本上都可以說開箱機用。
在我們公司是使用自己開發的一套sdk,因為是幫朋友,所以就用了網上的一套fastweixin。選用這個sdk,原因有:
- 用的人多,代表好用,穩定
- 開源,研究過源碼,可以根據需求二次開發
2. 引入sdk
引入fastweixin,可以通過鏈接直接到首頁進去查看。不過那個引入方式只是講了如何去自動回復微信公眾號消息。
先說我的需求(使用的接口) 其實用到就是微信分享接口(微信js),獲取微信用戶頭像(授權接口)。
1> 新建項目
小項目小需求的快速開發,那就用spring boot嘍。我用的IDE是IDEA
,新建項目直接選 spring initializer,實際上是通過https://start.spring.io/動態的生成了基礎的代碼,然后下載到你本地解壓。很方便的功能
2> 項目依賴
通過spring initializer
生成的項目可以直接在生成時選擇一些基礎依賴,例如mybatis-spring-boot-starter
,mysql-connector-java
等等,可以說開箱即用。不過sdk的依賴還是需要我們復制進去的,maven引入
<dependency> <groupId>com.github.sd4324530</groupId> <artifactId>fastweixin</artifactId> <version>1.3.15</version> </dependency>
3> 調用sdk,提供前端調用接口
微信接口里有個概念叫token,通過開發者id和密碼調用微信接口生成,2小時內有效。 所以sdk里有個ApiConfig
類使用單例模式作為獲取token的工具類。其實現就不多說,看使用的代碼
用於獲取token的代碼
@Service @Slf4j public class WeChatAppid { //把開發者id和密碼寫在配置文件,當然也有寫在數據庫里的。具體看需求 @Value("${appid}") private String appid; @Value("${appSecret}") private String appSecret; private ApiConfig config; /** * 這樣是為了讓spring先給appid,appSecret賦值。 */ @PostConstruct private void init(){ log.debug("appid : {} ,appSecret : {}" , appid,appSecret); config = new ApiConfig(appid,appSecret,true); } public ApiConfig getApiConf(){ return config; } }
供前端使用分享的接口 前后分離的項目,所以是這樣的,對於未分離的
@ApiOperation("微信js相關")//swagger接口文檔生成的注解 @GetMapping("wx/conf") public WxConf jsApi(HttpServletRequest request){ String url = request.getHeader("Referer"); if (StringUtils.isBlank(url)){ url = request.getRequestURL().toString(); } JsAPI jsAPI = new JsAPI(weChatAppid.getApiConf()); return new WxConf(weChatAppid.getApiConf().getAppid(),jsAPI.getSignature(url)); }
// 用於和前端對接的實體類 public class WxConf extends Resp implements Serializable,Response { private String appid; private GetSignatureResponse jsApi; public WxConf(String appid, GetSignatureResponse jsApi) { this.appid = appid; this.jsApi = jsApi; } }
4> 前端使用。。
前端使用---木有。。。。 應該再把前端用的代碼貼出來的,不過這個項目是幫忙
的,前端代碼沒在我這。 不過我這有個傳統的項目暫且看下
<script th:inline="javascript"> /*<![CDATA[*/ var appid = /*[[${appid}]]*/ ""; var openid = /*[[${openid}]]*/ ""; var api = /*[[${api}]]*/ {}; var phone = /*[[${phone}]]*/ ""; var shareUrl = /*[[${shareUrl}]]*/""; /*]]>*/ function share_data() { return { title: 'BMW歸國留學(進修)人員專屬禮遇', desc: '留學生免稅購車方案', link: shareUrl, imgUrl: "http://" + window.location.host + "/share.jpeg", success: function () { $.get("/share/" + openid + "/" + phone); }, cancel: function () {} } }; wx.config({ appId: appid, timestamp: api.timestamp, nonceStr: api.noncestr, signature: api.signature, jsApiList: [ 'showOptionMenu', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'previewImage', 'getLocation' ] }); wx.ready(function () { wx.showOptionMenu(); wx.onMenuShareTimeline(share_data()); wx.onMenuShareAppMessage(share_data()); wx.onMenuShareQQ(share_data()); wx.onMenuShareWeibo(share_data()); }); </script>
總結
微信開發真的很簡單,但有幾點需要注意:
- 開發測試時直接用微信測試號,那個可以免去很多配置,例如下面的配置在開發期間就不用配置了
- 后台ip白名單的配置,可以多配置幾個,開發的,生產的,測試的服務器都配置上
- 域名要用備案的,域名要配置到js接口,業務,授權,最多3個地方用於配置,根據業務的需求來,配置的時候需要在域名下部署一個txt文件,如果都是一個域名,部署一次就可以了。
- 微信開發者工具是個不錯的微信開發測試工具,可以直接看到js接口哪個錯了。
fastweixin這個sdk,常用基本夠用了,集群的話還需要再在一些開發。