【问题标题】:Dynamically create part of JavaScript block in aspx page from code behind从后面的代码动态地在 aspx 页面中创建 JavaScript 块的一部分
【发布时间】:2018-07-11 17:44:52
【问题描述】:

我正在以表单形式集成 SagePay,这需要通过 SagePay API 为每笔交易请求一个唯一的会话密钥。我已经成功获得了获取密钥的代码(使用后面的代码),如下所示:-

Public Class WebForm1
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim myReq As HttpWebRequest
        Dim myResp As HttpWebResponse
        Dim myData As String = "{""vendorName"": ""myvendorname""}"
        Dim mySessionKey As String

        myReq = HttpWebRequest.Create("https://pi-live.sagepay.com/api/v1/merchant-session-keys")
        myReq.Method = "POST"
        myReq.ContentType = "application/json"
        myReq.Headers.Add("Authorization", "Basic " & Convert.ToBase64String(Encoding.UTF8.GetBytes("apikey:apipassword")))
        myReq.GetRequestStream.Write(System.Text.Encoding.UTF8.GetBytes(myData), 0, System.Text.Encoding.UTF8.GetBytes(myData).Count)

        myResp = myReq.GetResponse
        Dim myreader As New System.IO.StreamReader(myResp.GetResponseStream)
        Dim myText As String
        myText = myreader.ReadToEnd
        'Response.Write(myText)
        mySessionKey = "{ merchantSessionKey: '" & Mid(myText, 65, 36) & "' }"

    End Sub

这将产生以下字符串 (mySessionKey),其格式为完成交易所需的格式(GUID 每次都不同):-

{ 商家会话密钥:'F42164DA-4A10-4060-AD04-F6101821EFC3' }

然后需要将上述内容注入到 javascript 块中的 .aspx 页面中,如下所述:-

  <body>
    <div id="main">
      <h1>My Test Shop</h1>
      <form>
        <h2>Payment Details</h2>
        <div id="sp-container"></div>
        <div id="submit-container">
         <input type="submit"/>
        </div>
      </form>
    </div>
    <script>
      sagepayCheckout({ merchantSessionKey: 'F42164DA-4A10-4060-AD04-F6101821EFC3' }).form();
    </script>
  </body>

我不知道如何将其动态注入到 aspx 页面中。

任何积分,非常感谢。

【问题讨论】:

标签: javascript asp.net vb.net


【解决方案1】:

我认为应该这样做:

把它放在你的视图状态中

ViewState("merchantSessionKey") = ....

然后在代码中:

<script>
  sagepayCheckout(<%= ViewState("merchantSessionKey") %>).form();
</script>

或者,如果您将其设为页面级别的公共变量(现在该变量是方法的本地变量):

<script>
  sagepayCheckout(<%= mySessionKey %>).form();
</script>

【讨论】:

  • 我相信 viewstate 不会在移动设备上工作,所以会阻止这个工作,比如手机从网页付款。此外,由于视图状态将采用 base64 编码,这不是安全问题,尽管会话密钥持续时间仅为 400 秒...
  • 无论如何你都把它以纯文本形式放在页面上......所以我不知道它的安全风险如何
  • 你可以在类级别做一个公共变量
  • 谢谢伙计们,是的,我猜安全性不是这样的问题,因为它仅对具有这些付款详细信息的供应商的会话有效,它不是完全可移植的。 Ctznkane525 你是对的,它在 javascript 中以纯文本形式存在。明天回来时我会尝试这些想法。有些人在谈论使用 RegisterClientScriptBlock,但我承认我完全迷失了......
  • 好的,所以我使用了视图状态,这我无法解释(这些现在是过期的密钥 :-))所以 Sagepay API 以有效的会话密钥 41BBB9C4-9F7D-40A6-89E2-ABA6102C208E 响应。当我右键单击并获取页面源时,它插入了一个不同的会话密钥,显示正确的格式:- sagepayCheckout({ MercerSessionKey: '6BD30256-B5A4-4B1A-AC65-AB4448AF159D' }).form();。有什么想法???
猜你喜欢
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
相关资源
最近更新 更多