ASP.NET Core在支付宝小程序中使用signalR

Posted myhalo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET Core在支付宝小程序中使用signalR相关的知识,希望对你有一定的参考价值。

Github有一个经过重写的微信小程序SignalR的js类库

https://github.com/liangshiw/SignalRMiniProgram-Client

于是我把他改成支付宝小程序的版本,上面这个项目的核心代码基本没有变,只是小程序开放接口改了一下,在支付宝小程序就能跑起来了

把下面的js代码复制到你的支付宝小程序即可(使用方法在下面):

【代码】

  1 const protocal = 
  2   protocol: "json",
  3   version: 1
  4 ;
  5 
  6 const MessageType = 
  7   /** Indicates the message is an Invocation message and implements the @link InvocationMessage interface. */
  8   Invocation: 1,
  9   /** Indicates the message is a StreamItem message and implements the @link StreamItemMessage interface. */
 10   StreamItem: 2,
 11   /** Indicates the message is a Completion message and implements the @link CompletionMessage interface. */
 12   Completion: 3,
 13   /** Indicates the message is a Stream Invocation message and implements the @link StreamInvocationMessage interface. */
 14   StreamInvocation: 4,
 15   /** Indicates the message is a Cancel Invocation message and implements the @link CancelInvocationMessage interface. */
 16   CancelInvocation: 5,
 17   /** Indicates the message is a Ping message and implements the @link PingMessage interface. */
 18   Ping: 6,
 19   /** Indicates the message is a Close message and implements the @link CloseMessage interface. */
 20   Close: 7,
 21 
 22 
 23 
 24 export class HubConnection 
 25 
 26   constructor() 
 27     this.openStatus = false;
 28     this.methods = ;
 29     this.negotiateResponse = ;
 30     this.url = "";
 31     this.invocationId = 0;
 32     this.callbacks = ;
 33   
 34 
 35   start(url, queryString) 
 36     var negotiateUrl = url + "/negotiate";
 37     if (queryString) 
 38       for (var query in queryString) 
 39         negotiateUrl += (negotiateUrl.indexOf("?") < 0 ? "?" : "&") + (`$query=` + encodeURIComponent(queryString[query]));
 40       
 41     
 42     my.request(
 43       url: negotiateUrl,
 44       method: "POST",
 45       success: (res) => 
 46         this.negotiateResponse = res.data;
 47         this.startSocket(negotiateUrl.replace("/negotiate", ""));
 48       ,
 49       fail: (res) => 
 50         console.error(`requrst $url error : $res`);
 51       
 52     );
 53   
 54 
 55   startSocket(url) 
 56     url += (url.indexOf("?") < 0 ? "?" : "&") + ("id=" + this.negotiateResponse.connectionId);
 57     url = url.replace(/^http/, "ws");
 58     this.url = url;
 59     if (this.openStatus) 
 60       return;
 61     
 62 
 63     console.log(url);
 64 
 65     my.connectSocket(
 66       url: url
 67     )
 68 
 69     my.onSocketOpen(res => 
 70       console.log(`websocket connectioned to $this.url`);
 71       this.sendData(protocal);
 72       this.openStatus = true;
 73       this.onOpen(res);
 74     );
 75 
 76     my.onSocketClose(res => 
 77       console.log(`websocket disconnection`);
 78       this.openStatus = false;
 79       this.onClose(res);
 80     );
 81 
 82     my.onSocketError(res => 
 83       console.error(`websocket error msg: $res`);
 84       this.close(
 85         reason: res
 86       );
 87       this.onError(res)
 88     );
 89 
 90     my.onSocketMessage(res => this.receive(res));
 91   
 92 
 93   on(method, fun) 
 94 
 95     let methodName = method.toLowerCase();
 96     if (this.methods[methodName]) 
 97       this.methods[methodName].push(fun);
 98      else 
 99       this.methods[methodName] = [fun];
100     
101   
102 
103   onOpen(data)  
104 
105   onClose(msg)  
106 
107   onError(msg)  
108 
109   close(data) 
110     if (data) 
111       console.error(‘closed socket: ‘ + data.reason);
112     
113 
114     my.closeSocket();
115 
116     this.openStatus = false;
117   
118 
119   sendData(data, success, fail, complete) 
120     my.sendSocketMessage(
121       data: JSON.stringify(data) + "", //
122       success: success,
123       fail: fail,
124       complete: complete
125     );
126   
127 
128 
129   receive(data) 
130     if (data.data.length > 3) 
131       data.data = data.data.replace(‘‘, "")
132     
133 
134     var messageDataList = data.data.split("");
135 
136     //循环处理服务端信息
137     for (let serverMsg of messageDataList) 
138       if (serverMsg) 
139         var messageData = serverMsg.replace(new RegExp("", "gm"), "")
140         var message = JSON.parse(messageData);
141 
142         switch (message.type) 
143           case MessageType.Invocation:
144             this.invokeClientMethod(message);
145             break;
146           case MessageType.StreamItem:
147             break;
148           case MessageType.Completion:
149             var callback = this.callbacks[message.invocationId];
150             if (callback != null) 
151               delete this.callbacks[message.invocationId];
152               callback(message);
153             
154             break;
155           case MessageType.Ping:
156             // Don‘t care about pings
157             break;
158           case MessageType.Close:
159             console.log("Close message received from server.");
160             this.close(
161               reason: "Server returned an error on close"
162             );
163             break;
164           default:
165             console.warn("Invalid message type: " + message.type);
166         
167       
168     
169   
170 
171   send(functionName) 
172     var args = [];
173     for (var _i = 1; _i < arguments.length; _i++) 
174       args[_i - 1] = arguments[_i];
175     
176 
177     this.sendData(
178       target: functionName,
179       arguments: args,
180       type: MessageType.Invocation,
181       invocationId: this.invocationId.toString()
182     );
183     this.invocationId++;
184   
185 
186   invoke(functionName) 
187     var args = [];
188     for (var _i = 1; _i < arguments.length; _i++) 
189       args[_i - 1] = arguments[_i];
190     
191 
192     var _this = this;
193     var id = this.invocationId;
194     var p = new Promise(function(resolve, reject) 
195 
196       _this.callbacks[id] = function(message) 
197         if (message.error) 
198           reject(new Error(message.error));
199          else 
200           resolve(message.result);
201         
202       
203 
204       _this.sendData(
205         target: functionName,
206         arguments: args,
207         type: MessageType.Invocation,
208         invocationId: _this.invocationId.toString()
209       , null, function(e) 
210         reject(e);
211       );
212 
213     );
214     this.invocationId++;
215     return p;
216   
217 
218   invokeClientMethod(message) 
219     var methods = this.methods[message.target.toLowerCase()];
220     if (methods) 
221       methods.forEach(m => m.apply(this, message.arguments));
222       if (message.invocationId) 
223         // This is not supported in v1. So we return an error to avoid blocking the server waiting for the response.
224         var errormsg = "Server requested a response, which is not supported in this version of the client.";
225         console.error(errormsg);
226         this.close(
227           reason: errormsg
228         );
229       
230      else 
231       console.warn(`No client method with the name ‘$message.target‘ found.`);
232     
233   
234 

【使用方法】

const hub = require(‘../../utils/signalr.js‘);

const connection = new hub.HubConnection();

//注意:这里的apiHost不是wss或ws,是https或http
connection.start(`$apiHost/yourHub`,  access_token: ‘如果有token则填写‘ );

connection.onOpen = res => 
    my.showToast(
         content: ‘成功开启连接‘
     );


connection.on(‘服务器的回调方法‘, (errorCode) => 
      my.showToast(
           content: errorCode
       );
        console.log(errorCode);
);

connection.send(‘Hub中的方法‘, ‘参数1‘, ‘参数2‘);

 

以上是关于ASP.NET Core在支付宝小程序中使用signalR的主要内容,如果未能解决你的问题,请参考以下文章

二、支付宝小程序前端样式的设计.acss样式详解

开通加入支付宝小程序怎么收费

吐槽支付宝小程序支付-php

支付宝小程序是啥

支付宝小程序授权登录踩坑

记录一下支付宝小程序的坑