- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
Grails 有两个 PayPal 插件,first I found is a year old似乎井井有条。 second it a bit older and apparently not compatible with 1.1+ .
如果我决定不使用现有插件,那么为 Grails 实现简单快速结账流程的最佳方式是什么?我不完全确定使用 PayPal API 会发生什么,而且随着迁移到 X.com,他们的文档目前非常困惑。
最佳答案
这是我从 Paypal 插件中透露的 IPNcontroller 以匹配 Paypal IPN 要求。它正在生产中。
package com.risguru.plugin.ipn
import com.risguru.plugin.shoppingcart.IOrderService
class PaymentController {
IOrderService orderService
def config = grailsApplication.config.grails.paypal
static allowedMethods = [buy: 'POST', notify: 'POST']
static defaultAction = 'index'
def index = {
redirect(controller:'company', action:'index')
}
def notify = {
log.debug "Received IPN notification from PayPal Server ${params}"
try {
def config = grailsApplication.config.com.risguru.plugin.ipn
def server = config.server
def receiver = params.email ?: config.receiver
if (!server || !receiver) throw new IllegalStateException("Paypal misconfigured! You need to specify the Paypal server URL and/or account email. Refer to documentation.")
params.cmd = "_notify-validate"
def queryString = params.toQueryString()[1..-1]
log.debug "Sending back query $queryString to PayPal server $server"
def url = new URL(server)
def conn = url.openConnection()
conn.doOutput = true
def writer = new OutputStreamWriter(conn.getOutputStream())
writer.write queryString
writer.flush()
def result = conn.inputStream.text?.trim()
log.debug "Got response from PayPal IPN $result"
def purchaseOrder = orderService.getOrderByTransactionID(params.transactionId)
if (purchaseOrder && result == 'VERIFIED') {
if (params.receiver_email != receiver) {
log.warn """WARNING: receiver_email parameter received from PayPal does not match configured e-mail. This request is possibly fraudulent!
REQUEST INFO: ${params}
"""
}
else {
request.purchaseOrder = purchaseOrder
def status = params.payment_status
if (purchaseOrder.paymentStatus != PaymentStatus.COMPLETE && purchaseOrder.paymentStatus != PaymentStatus.CANCELLED) {
if (purchaseOrder.paypalTransactionId && purchaseOrder.paypalTransactionId == params.txn_id) {
log.warn """WARNING: Request tried to re-use and old PayPal transaction id. This request is possibly fraudulent!
REQUEST INFO: ${params} """
}
else if (status == 'Completed') {
purchaseOrder.paypalTransactionId = params.txn_id
purchaseOrder.paymentStatus = PaymentStatus.COMPLETE
orderService.updateOrderStatus(purchaseOrder)
log.info "Verified payment ${purchaseOrder.paypalTransactionId} as COMPLETE"
} else if (status == 'Pending') {
purchaseOrder.paypalTransactionId = params.txn_id
purchaseOrder.paymentStatus = PaymentStatus.PENDING
orderService.updateOrderStatus(purchaseOrder)
log.info "Verified payment ${purchaseOrder.paypalTransactionId} as PENDING"
} else if (status == 'Failed') {
purchaseOrder.paypalTransactionId = params.txn_id
purchaseOrder.paymentStatus = PaymentStatus.FAILED
orderService.updateOrderStatus(purchaseOrder)
log.info "Verified payment ${purchaseOrder.paypalTransactionId} as FAILED"
}
}
}
}
else {
log.error "Error with PayPal IPN response: [$result] and Payment: [${purchaseOrder?.transactionId}]"
}
} catch (Exception e) {
log.error '"**************************************************************************'
log.error e
log.error '"**************************************************************************'
} finally {
render "OK" // Paypal needs a response, otherwise it will send the notification several times!
}
}
def success = {
log.info "Received IPN success from PayPal Server ${params}"
def uniqueKey = orderService.completeAndGetUniqueKeyByTransactionID(params.transactionId)
if (!uniqueKey){
response.sendError 403
return
}
log.info "Purchase Order complete for ${params.transactionId}"
flash.orderStatus = OrderStatus.COMPLETE
flash.transactionId = params.transactionId
flash.uniqueKey = uniqueKey
if (params.returnAction || params.returnController) {
def args = [:]
if (params.returnAction) args.action = params.returnAction
if (params.returnController) args.controller = params.returnController
args.params = params
redirect(args)
}
else {
chain(action:'termOfUse')
}
}
def cancel = {
params?.each { key, value ->
println "[${key}]\t=\t${value}\t::${value?.class?.name}"
}
log.info "Cancel Order for ${params.transactionId}"
def status = orderService.cancelOrder(params.transactionId)
if (!status){
response.sendError 403
}
flash.orderStatus = OrderStatus.CANCEL
flash.transactionId = params.transactionId
if (params.cancelAction || params.cancelController) {
def args = [:]
if (params.cancelAction) args.action = params.cancelAction
if (params.cancelController) args.controller = params.cancelController
args.params = params
redirect(args)
}
else {
chain(action:'termOfUse')
}
}
def termOfUse = {
if (flash.orderStatus == OrderStatus.COMPLETE || flash.orderStatus == OrderStatus.CANCEL){
return ['transactionId':flash.transactionId, 'uniqueKey':flash.uniqueKey, message:params.message]
}
def transactionId = params.transactionId ?: flash.transactionId
def uniqueKey = params.uniqueKey ?: flash.uniqueKey
def orderStatus = orderService.checkOrderStatus(transactionId)
if (OrderStatus.COMPLETE == orderStatus){
log.debug "Purchase Order complete for ${transactionId}"
flash.transactionId = transactionId
flash.orderStatus = OrderStatus.COMPLETE
flash.uniqueKey = uniqueKey
} else {
def order = orderService.createOrder(uniqueKey)
switch (order.paymentStatus) {
case PaymentStatus.FREE:
flash.transactionId = order.transactionId
flash.uniqueKey = uniqueKey
flash.orderStatus = OrderStatus.FREE
break
case PaymentStatus.INVALID:
flash.transactionId = order.transactionId
flash.uniqueKey = uniqueKey
flash.orderStatus = OrderStatus.INVALID
break
case PaymentStatus.PENDING:
flash.transactionId = order.transactionId
flash.uniqueKey = uniqueKey
flash.orderStatus = OrderStatus.CHARGE
break
default:
response.sendError 403
}
}
return ['transactionId':transactionId, 'uniqueKey':uniqueKey, message:params.message]
}
def buy = {
if (params.disagree){
return chain(action:'cancel', params:params)
}
def config = grailsApplication.config.com.risguru.plugin.ipn
def server = config.server
def receiver = params.email ?: config.receiver
if (!server || !receiver) throw new IllegalStateException("Paypal misconfigured! You need to specify the Paypal server URL and/or account email. Refer to documentation.")
def order = orderService.getOrderByTransactionID(params.transactionId)
if (!order){
response.sendError 403
}
def commonParams = [transactionId: order.transactionId]
def notifyURL = g.createLink(absolute: true, controller: 'payment', action: 'notify', params: commonParams).encodeAsURL()
def successURL = g.createLink(absolute: true, controller: 'payment', action: 'success', params: commonParams).encodeAsURL()
def cancelURL = g.createLink(absolute: true, controller: 'payment', action: 'cancel', params: commonParams).encodeAsURL()
def url = new StringBuffer("$server?")
url << "cmd=_xclick&"
// url << "business=${config.business}&"
url << "business=${receiver}&"
url << "item_name=${order.items[0].itemName}&"
url << "item_number=${order.items[0].itemNumber}&"
url << "quantity=${order.items[0].quantity}&"
url << "amount=${order.items[0].unitPrice}&"
url << "tax=${order.tax}&"
url << "currency_code=${order.currency}&"
if (config.test_ipn) {
url << "test_ipn=1&"
}
if (config.page_style){
url << "page_style=${config.page_style}&"
}
url << "notify_url=${notifyURL}&"
url << "return=${successURL}&"
url << "cancel_return=${cancelURL}"
log.debug "Redirection to PayPal with URL: $url"
redirect(url: url)
}
}
关于Grails 和 PayPal(快速结帐),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4809018/
我似乎记得在某个地方看到过这个,但在我的一生中,搜索并没有出现我正在寻找的结果。这是我想要的: 我有一个项目存储库。我想将其他 svn 存储库中的库包含在我的项目中。当我对主项目执行 SVN 提交时,
我正在 Magento 中寻找我的结帐购物车页面的解决方案。当我将商品放入购物车时,购物车页面变得空白。!! 我已经尝试了几个选项,但它仍然显示为空白。我启用了 cookie 等,但仍然没有运气。我正
我有一个文件,其中包含 CVS 存储库中包含的许多标签。有没有一种方法可以只使用这些标签 checkout 所有文件及其相关目录,而无需 checkout 整个存储库? 我没有存储库中的目录列表,因此
我正在尝试为客户站点开发一个结帐系统,我想知道执行此操作的最佳方法。请让我知道我在下面尝试过的任何替代方法。 目前我有: 1) 购物车中的商品保存到 $_SESSION 变量 2) 当用户按下“结帐”
我真的很想为我正在开发的市场使用 Paypal。我需要允许用户输入他们的 paypal 电子邮件地址,每当客户购买该用户的产品时,我都会收取少量费用,然后剩下的钱会转到列出该产品的用户。 哪种 pay
有没有办法让输入信用卡信息的部分默认打开,而不是输入paypal信息的部分? 我真的很需要这个,但是到处都找不到! 最佳答案 做到这一点的唯一方法是使用 Express Checkout .在你的Se
我正在使用在 node 下运行的 Stripe Subscription。 我想创建一个预先填写电子邮件地址的新结帐。所以我尝试在客户端做: // Setup event handler to cre
我正在尝试使用 Checkout Dependencies Leiningen 中的功能用于使用 Flambo checkout 的项目.我的 project.clj 看起来像这样: (defproj
谁能告诉我如何使用 Maven 从 SVN 进行结账和进一步更新?我阅读了 maven.apache.org 上的文档,但似乎我对此太愚蠢了,因为我无法理解如何使用 scm:checkout 和 sc
我在 onepage/checkout/success 页面上遇到了麻烦,因为我想将根模板从 2columns-right.phtml 设置为 1column.phtml。应该问题不大... 我得到了
我使用 subversion 创建新存储库的正常工作流程是创建一个新存储库,检查存储库根目录,创建我的分支标签和主干文件夹,并将我的初始文件放在主干中。然后我提交这个“初始导入”,从我的硬盘驱动器中删
我已经使用以下代码向管理员用户添加了自定义元字段:`` function wporg_usermeta_form_field_birthday( $user ) { ?>
我想将 CVS 模块深处的特定文件夹 check out 到我的 Hudson/Jenkins 工作区中。剥离其他选项(例如修剪、分支等),CVS 命令是... cvs checkout -d wor
我正在尝试 git checkout Jenkinsfile跟随方式 stage ('Repo Checkout') { steps { dir('My-Repo') {
我们的大多数项目都使用很多通用代码。我们(最终)正朝着以统一方式管理共享代码的系统迈进。我们将共享代码视为 SVN 中的一个单独项目,然后将其作为外部引用。然而,我们倾向于在项目开发时将外部库指向开发
我已经使用 node.js 实现了 strip 结帐 product.photo是 https://test.s3.amazonaws.com/2213131 const session = awai
将产品添加到购物车时出现问题,它会转到结帐页面,但除了周围的页眉/页脚模板之外,该页面是空的。 我已经尝试了我能想到的一切,它不是主题(发生在所有主题上),我尝试禁用编译器和刷新缓存等.. 服务器日志
有什么方法可以禁用 Magento 中的购物卡/结账/送货选项吗? 我正在开发一个产品比较网站,其价格是从联属网站列出的。 我实际上并没有在我的网站上销售任何东西。 最佳答案 aDVo,如果禁用以下m
我正在做一个订购冰淇淋的程序,用户首先应该在圆锥体或杯子之间进行选择(作为按钮),当他单击按钮时,总数会显示在文本字段中,然后他可以继续选择口味作为复选框,每当他添加额外的 flavor 等时,总数就
我正在使用 HTML 5 required 属性进行表单验证。现在我想要的是,如果表单已经通过了 HTML 5 验证,它应该将用户带到 strip 结帐(我故意在下面的代码中为 SO 问题 xxx 输
我是一名优秀的程序员,十分优秀!