jBilling:如何以编程方式创建付款?

时间:2013-11-22 14:41:16

标签: java payment billing

如何以预定插件的编程方式在jBilling中创建付款?问题是我想创建一个没有链接到任何发票的付款,所以我尝试使用

applyPayment(PaymentDTOEx payment, Integer invoiceId, Integer executorUserId)

使用invoiceId = null,但会导致错误:

  

org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话

最初我尝试:

IPaymentSessionBean psb = Context.getBean(Context.Name.PAYMENT_SESSION);
psb.applyPayment(new PaymentDTOEx(paymentWS), null, userID);

之后我之前添加了“userbl.webServicesAuthenticate(user,pass)”,但结果是一样的。

我认为我错过了一些重要的事情,也许完全错了。

3 个答案:

答案 0 :(得分:1)

我之前从未使用过jBilling,但经过一些谷歌搜索后,似乎它使用Spring来管理交易等。

根据您引用的错误,您似乎没有打开Hibernate会话。如果您使用的是Web框架(例如Spring MVC),则通常使用servlet过滤器透明地管理Hibernate会话生命周期。

如果您从预定的服务执行付款,则可能需要在服务中自行打开和关闭Hibernate会话。有一些文档here描述了如何使用Spring以编程方式执行此操作。

另请查看@Transactional注释。这可能就像使用此注释您的预定作业方法一样简单。

答案 1 :(得分:1)

感谢rcgeorge23! 问题是没有打开活动的Hibernate会话。这是工作代码:

    IPaymentSessionBean psb = Context.getBean(Context.Name.PAYMENT_SESSION);

    //transaction manager is available in jBilling like that:
    PlatformTransactionManager txManager = Context.getBean(Context.Name.TRANSACTION_MANAGER);

    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    def.setName("CreatePaymentTransaction");
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); //not sure which strategy is best in this case 

    TransactionStatus status = txManager.getTransaction(def);
    String ret;

    try {
        ret =Integer.toString(psb.applyPayment(new PaymentDTOEx(paymentWS), null, userID));
    }
    catch (Exception ex) {
        txManager.rollback(status);
        throw ex;
    }
    txManager.commit(status);

答案 2 :(得分:0)

您还可以为用户创建插件。

例如,当用户创建或添加时,应支付默认金额。

因为你必须编写一个插件,它将在创建用户时出现。