使用 authorize.net cim 定期付款

Posted

技术标签:

【中文标题】使用 authorize.net cim 定期付款【英文标题】:recurring payment using authorize.net cim 【发布时间】:2014-01-06 09:25:23 【问题描述】:

我有一个信用卡帐户部分,用户可以在其中输入他们的信用卡信息。我会将这些信息发送到 authorize.net 并为该用户创建一个 cim id(customerProfileId)。所以现在我们在我的网站上有了抄送信息。

我的网站在 4 个部分中有 4 种付款方式。其中一些是经常性付款。我想使用保存的 CIM id 创建这些付款。那不是强迫用户一次又一次地输入抄送信息。

通过API来做这件事的方法是什么?我检查了套利指南,但找不到提交 cimid 的字段。

【问题讨论】:

【参考方案1】:

ARB 和 CIM 未连接。如果您使用 CIM,则需要创建自己的定期计费引擎以根据配置文件收费。

【讨论】:

【参考方案2】:

我为 ARB 实现了什么:

创建了一个 Web 服务,当调用 Web 服务时,它会从数据库中获取记录,并针对未来交易日期的特定客户 ID 执行交易。

现在我像这样在 SQL JOB 中安排了这个事务

Insert Into ARBSQLJobLog (SQLJobLoggedTime) VALUES(GetDATE())
declare @xmlOut varchar(8000)
Declare @RequestText as varchar(8000);
set @RequestText=
'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:CreateOrder>
         <!--Optional:-->
         <tem:OrderRequest>
            <tem:OrderId>200</tem:OrderId>
            <!--Optional:-->
            <tem:OrderName>something</tem:OrderName>
         </tem:OrderRequest>
      </tem:CreateOrder>
   </soapenv:Body>
</soapenv:Envelope>'
exec sProc_XXB_InvokeARBWebService 
'http://localhost/ZBC/XXXXX.asmx/CheckScheduledTransForToday', 

存储过程

--执行sProc_XXB_InvokeARBWebService

CREATE PROCEDURE [dbo].[sProc_XXB_InvokeARBWebService]                

      @URI varchar(2000) = '',        
      @methodName varchar(50) = '',   
      @requestBody varchar(8000) = '',   
      @SoapAction varchar(255),   
      @UserName nvarchar(100), -- Domain\UserName or UserName   
      @Password nvarchar(100),   
      @responseText varchar(8000) output  
AS         


SET NOCOUNT ON  
IF    @methodName = ''  
BEGIN  
      select FailPoint = 'Method Name must be set'  
      return  
END  
set   @responseText = 'FAILED'  
DECLARE @objectID int  
DECLARE @hResult int  
DECLARE @source varchar(255), @desc varchar(255)   
EXEC @hResult = sp_OACreate 'MSXML2.ServerXMLHTTP', @objectID OUT  
IF @hResult <> 0   
BEGIN  
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT  
      SELECT      hResult = convert(varbinary(4), @hResult),   
                  source = @source,   
                  description = @desc,   
                  FailPoint = 'Create failed',   
                  MedthodName = @methodName   
      goto destroy   
      return  
END  
-- open the destination URI with Specified method   
EXEC @hResult = sp_OAMethod @objectID, 'open', null, @methodName, @URI, 'false', @UserName, @Password  
IF @hResult <> 0   
BEGIN  
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT  
      SELECT      hResult = convert(varbinary(4), @hResult),   
            source = @source,   
            description = @desc,   
            FailPoint = 'Open failed',   
            MedthodName = @methodName   
      goto destroy   
      return  
END  
-- set request headers   
EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Content-Type', 'text/xml;charset=UTF-8'  
IF @hResult <> 0   
BEGIN  
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT  
      SELECT      hResult = convert(varbinary(4), @hResult),   
            source = @source,   
            description = @desc,   
            FailPoint = 'SetRequestHeader failed',   
            MedthodName = @methodName   
      goto destroy   
      return  
END  
-- set soap action   
EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'SOAPAction', @SoapAction   
IF @hResult <> 0   
BEGIN  
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT  
      SELECT      hResult = convert(varbinary(4), @hResult),   
            source = @source,   
            description = @desc,   
            FailPoint = 'SetRequestHeader failed',   
            MedthodName = @methodName   
      goto destroy   
      return  
END  
declare @len int  
set @len = len(@requestBody)   
EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Content-Length', @len   
IF @hResult <> 0   
BEGIN  
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT  
      SELECT      hResult = convert(varbinary(4), @hResult),   
            source = @source,   
            description = @desc,   
            FailPoint = 'SetRequestHeader failed',   
            MedthodName = @methodName   
      goto destroy   
      return  
END  
/*   
-- if you have headers in a table called RequestHeader you can go through them with this   
DECLARE @HeaderKey varchar(500), @HeaderValue varchar(500)   
DECLARE RequestHeader CURSOR  
LOCAL FAST_FORWARD   
FOR  
      SELECT      HeaderKey, HeaderValue   
      FROM RequestHeaders   
      WHERE       Method = @methodName   
OPEN RequestHeader   
FETCH NEXT FROM RequestHeader   
INTO @HeaderKey, @HeaderValue   
WHILE @@FETCH_STATUS = 0   
BEGIN  
      --select @HeaderKey, @HeaderValue, @methodName   
      EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, @HeaderKey, @HeaderValue   
      IF @hResult <> 0   
      BEGIN  
            EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT  
            SELECT      hResult = convert(varbinary(4), @hResult),   
                  source = @source,   
                  description = @desc,   
                  FailPoint = 'SetRequestHeader failed',   
                  MedthodName = @methodName   
         goto destroy   
            return  
      END  
      FETCH NEXT FROM RequestHeader   
      INTO @HeaderKey, @HeaderValue   
END  
CLOSE RequestHeader   
DEALLOCATE RequestHeader   
*/   
-- send the request   
EXEC @hResult = sp_OAMethod @objectID, 'send', null, @requestBody   
IF    @hResult <> 0   
BEGIN  
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT  
      SELECT      hResult = convert(varbinary(4), @hResult),   
            source = @source,   
            description = @desc,   
            FailPoint = 'Send failed',   
            MedthodName = @methodName   
      goto destroy   
      return  
END  
declare @statusText varchar(1000), @status varchar(1000)   
-- Get status text   
exec sp_OAGetProperty @objectID, 'StatusText', @statusText out  
exec sp_OAGetProperty @objectID, 'Status', @status out  
select @status, @statusText, @methodName   
-- Get response text   
exec sp_OAGetProperty @objectID, 'responseText', @responseText out  
IF @hResult <> 0   
BEGIN  
      EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT  
      SELECT      hResult = convert(varbinary(4), @hResult),   
            source = @source,   
            description = @desc,   
            FailPoint = 'ResponseText failed',   
            MedthodName = @methodName   
      goto destroy   
      return  
END  
destroy:   
      exec sp_OADestroy @objectID   
SET NOCOUNT OFF  

【讨论】:

以上是关于使用 authorize.net cim 定期付款的主要内容,如果未能解决你的问题,请参考以下文章

Authorize.net CIM SOAP API getCustomerPaymentProfile 错误

使用 Authorize.Net 进行定期付款

Authorize.Net ARB API 获取定期付款的状态

如何在 Authorize.Net 定期付款中更改下一个周期计费日期

ActiveMerchant 如何处理 Authorize.net 上的定期付款取消信用卡帐户?

Authorize.net 自动定期账单支付 API