Code Monkey home page Code Monkey logo

alipay's People

Contributors

agonzalezro avatar chloerei avatar dulao5 avatar fx-hao avatar graysonchen avatar halczy avatar hungyuhei avatar jasl avatar jimhj avatar kahshing96 avatar lingceng avatar linjunpop avatar moohao avatar ryancheung avatar saberma avatar sen avatar serco-chen avatar tzzzoz avatar wongy91 avatar xiaohesong avatar xiejiangzhi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

alipay's Issues

Any demo for "境外收单" ?

目前有需求向外国人出售软件产品。经过调查认为支付宝只支持人民币。 我看到这个gem的文档,提到境外收单。想了解下支付宝是可以实现美元收款的吗?还有是否支持国外的visa,master card等等支付方式?
问题可能跟技术无关哈。 如果有一个运行中的例子就最好了,一看便知。

APP SDK 需要的查询参数示例中的method有误

sdk_execute方法返回的就是APP SDK请求的参数.
示例中的method应该修改为: 'alipay.trade.app.pay'

# Generate a query string that use for APP SDK excute.
    #
    # Example:
    #
    #   alipay_client.sdk_execute(
    #     method: 'alipay.trade.page.pay',
    #     biz_content: {
    #       out_trade_no: '20160401000000',
    #       product_code: 'QUICK_MSECURITY_PAY',
    #       total_amount: '0.01',
    #       subject: 'test'
    #     }.to_json,
    #     timestamp: '2016-04-01 00:00:00'
    #   )
    #   # => 'app_id=2016000000000000&charset=utf-8&sig....'
    def sdk_execute(params)
      params = prepare_params(params)

      URI.encode_www_form(params)
    end

回调notify_url参数无效

`
@alipay_client.page_execute_url(
method: AlipayScan::Interface::TradePagePay,
biz_content: JSON.generate({
out_trade_no: '1234567891112',
product_code: 'FAST_INSTANT_TRADE_PAY',
total_amount: '0.01',
subject: '测试一下',
qr_pay_mode: 4,
}, ascii_only: true),
timestamp: Time.now.strftime('%Y-%m-%d %H:%M:%S'),
notify_url: "#{::HostSetting.domain}/pay/alipays/alipay_scan_code_notify",

    )`

扫码支付成功后 不通知notify_url的地址,请问支持notify_url参数吗。

请问app支付可以用么?

如题: 我在使用alipay.trade.app.pay 时, 传过 app_id依旧,返回错误提示 “缺少app_id”, 。 请问这个gem支付app支付吗

扫码支付回调会报 ActionController::BadRequest 的错,发现返回的回调中的编码是 GBK

回调中报错:ActionController::BadRequest (Invalid request parameters: Invalid encoding for parameter: ���Ų����ײ�)。
试着加入中间件拦截后发现回调中的 charset 是 GBK。可能是我的 subject 参数是中文的原因

目前解决方案是在网关地址后面加 ?charset=UTF-8

@client = Alipay::Client.new(
  url: "https://openapi.alipay.com/gateway.do?charset=UTF-8",
  app_id: APP_ID,
  app_private_key: APP_PRIVATE_KEY,
  alipay_public_key: ALIPAY_PUBLIC_KEY
)

alipay 0.6.0 里程碑和 alipay-demo 项目

不知不觉,从 alipay v0.0.1 发布至今已经过去一年半了。一开始这个 gem 只有担保交易和确认发货两个接口,在多人的贡献下,alipay 支持越来越多的接口。

逐渐这个项目有点难维护了:

  1. 代码开始凌乱。
  2. alipay 接口本身是个黑箱,需要在线调试才能确定某个接口行为是否符合预期。
  3. 每个人都只有部分访问权限,只能确认自己用到的部分是否工作正常(包括我)。
  4. 开发阶段用生产应用做测试太繁重了。

所以我在 0.6.0.beta1 进行了一些改进:

  1. 重构去除一些重复代码。主要是 Sign 部分,预留了 RSA 和 DSA 加密,添加了 verify_rsa? 验证,详情请看 CHANGELOG。
  2. 把测试库升级为 Minitest,并且把某些测试用例固化成字符串。
  3. 开发了 alipay-demo 项目,详情在后面介绍。

alipay-demo

项目地址: https://github.com/chloerei/alipay-demo

这个是个 Rails app,它有两个目的,一是演示 alipay gem 的用法,二是供 gem 的开发者测试。它为 heroku 部署做了优化,可以免费部署到 heroku 做在线调试。你可以查看项目的 README,或者 Heroku 的文档了解如何部署 Rails app https://devcenter.heroku.com/articles/getting-started-with-rails4

目前它只有担保交易和确认发货的示例,因为我只有这两个接口的访问权限。欢迎其它接口的贡献者也为这个项目添加接口的示例,这样以后调试的时候就不用部署测试环境的生产应用了(当然最终更新 gem 到生产环境前还是应该先用真实应用测试)。

贡献示例请按照以下准则:

  1. 最小可行的示例,不需要太复杂的场景(现有示例甚至没有用数据库)。
  2. 一个接口一个示例既可,优先完善现有示例,如果一个接口有多种用途则例外。
  3. 参考现有示例。

提交按照一般的 PR 流程既可。友情提示:当在调试 alipay gem 的时候,可以创建一个 alipay-demo 分支,更新 Gemfile 指向自己的的 alipay branch 用作测试。

0.6.0 TODO

我计划中为了发布 0.6.0 还需要完成:

  1. 测试反馈,我不知道我没有权限访问的接口是否有被重构搞坏。
  2. 改进文档和注释。alipay 的接口名不标注中文可能根本看不懂含义,但是我希望这个 gem 能为 Ruby 开发者所用而不仅仅是 Ruby 中文开发者,所以需要一种合适的注释格式。
  3. 添加 RSA 和 DSA 加密/验证。

希望 alipay gem 的贡献者和使用者提供反馈,集成支付宝的过程很痛苦,一个良好维护的 gem 能让痛苦来得轻一点。

subject 中文乱码问题

调用 alipay.trade.precreate 时,如果 subject 含有中文,用支付宝 APP 扫描二维码,商品名称会显示成乱码,设置 charset 、转换编码都没用。

alipay_client = Alipay::Client.new(
  url: 'https://openapi.alipaydev.com/gateway.do',
  app_id: '2016000000000000',
  app_private_key: APP_PRIVATE_KEY,
  alipay_public_key: ALIPAY_PUBLIC_KEY
)

alipay_client.page_execute_url(
  method: 'alipay.trade.page.pay',
  biz_content: {
    out_trade_no: '20160401000000',
    product_code: 'FAST_INSTANT_TRADE_PAY',
    total_amount: '0.01',
    subject: 'test'
  }.to_json, # to_json is important!
  timestamp: '2016-04-01 00:00:00'
)
# => 'https://openapi.alipaydev.com/gateway.do?app_id=201600...'

经过几次调试后,我将上述 README 中 to_json 位置的代码改为 JSON.generate(biz_content, ascii_only: true) 后,终于显示正常。建议更新 README 和相关代码。

irb(main):001:0> { subject: '测试' }.to_json
=> "{\"subject\":\"测试\"}"
irb(main):002:0> JSON.generate({ subject: '测试' }, ascii_only: true)
=> "{\"subject\":\"\\u6d4b\\u8bd5\"}"

录制本 Gem 的使用视频

Hi Rei,

可能你还记得,我录制过一本支付宝站内集成的课程:http://haoqicat.com/happypeter/zhi-fu-bao-shou-kuan-ji-cheng 一年来卖了30来个拷贝。我觉得挺高兴,不过最近我这套课程需要更新了,因为支付宝下线了“双功能”接口,而我的课程中是以双功能为核心来讲的。用的 Gem 是我参考你和大庆的项目自己拼凑的 alipay_dualfun 。

最近的改进版中,我打算完全按照你的这个 Gem 来讲,我会

  • 当然课程还是会收费的,但是我会开放40%的内容出来,开放的内容中会提及 Gem 的作者出处
  • 不知道你对课程的内容安排有没有什么建议?
  • 可否在本 Gem 的 Readme 或者其他地方给我的课程挂一个链接?
  • 课程收入的 20% 会分成给你,因为使用你的 Gem 相当于你是课程的共同作者了

不知道大牛你意下如何?

Chinese coding in the subject

use alipay.trade.pay interface. if I am use subject chinese, interface is error: "Invalid Arguments". else if I am use subject en, then successfully.

网银支付

支付宝网银支付的功能有集成吗?

wap 支付,呼出支付宝客户端

在支付参数中加入 app_pay: 'Y', 如手机已安装支付宝客户端,浏览器会提示是否呼出客户端支付。
亲测 create_forex_trade_wap 有效,可否在文档添加此处说明,毕竟 native支付要比网页支付体验好的多

文件组织方式改进

我在尝试将过去为alipay打的补丁合并到最新的开发版本当中,其中实现了

  • RSA方式的签名
  • 移动APP的支付API
  • 用于移动端的风险探测接口(在移动端必须提前调用否则支付存在额度限制)

结合支付宝的API文档和通过浏览最近版本的代码,有一点想讨论:
以平台的方式组织文件,而不是用途,是不是更好一些?简单的说就是wap目录中存放sign.rb, notify.rb, service.rb,这样属于wap平台的API和相关函数在同一命名空间下,同理App平台的相关函数。

签名算法放入sign目录,即Sign命名空间,然后不同的算法单独文件保存,如 Alipay::Sign::Md5 且只包含 generateverify?两个方法,因为不同平台的API的params_to_string的算法有可能是不同的,就交给不同平台的sign.rb去处理

我认为这样处理的话会更清晰,而且容易修改,看看大伙有什么看法,我来考虑如何移植代码

签名出问题了 OpenSSL::PKey::RSAError (Neither PUB key nor PRIV key: nested asn1 error)

按照官方的教程 上传了RSA1024 跟 RSA2 2048的公钥
拿到了各自的支付宝支付宝公钥
结果也是字符串写到配置

F, [2018-07-20T17:01:13.906460 #28170] FATAL -- : [3ded77cb-d40d-4c25-b6fd-df1893b03b12]
F, [2018-07-20T17:01:13.906676 #28170] FATAL -- : [3ded77cb-d40d-4c25-b6fd-df1893b03b12] OpenSSL::PKey::RSAError (Neither PUB key nor PRIV key: nested asn1 error):
F, [2018-07-20T17:01:13.906813 #28170] FATAL -- : [3ded77cb-d40d-4c25-b6fd-df1893b03b12]

请问有没有遇到一样情况的同学

关于支付宝移动支付RSA疑问

朋友,支付宝移动网站支付要用RSA,我看了你写的这部分获取sign的代码,用这个生成的sign还是无法发起支付宝支付

def self.sign(key, string)
sa = OpenSSL::PKey::RSA.new(key)
Base64.encode64(rsa.sign('sha1', string))
end

MD5校验用的key和RSA校验用的key应该拆开

RT,在我们的系统里,浏览器里的一般调用使用了MD5方式签名,但APP必须使用RSA方式签名,是不是分成md5_keyrsa_key更合适?
(最近工作比较紧,先提一下建议看看意见)

如何设置alipay RSA

我的理解是移动支付需要RSA sign_type。需要自己生成private key 和 public key. public key需要上传给支付宝网站,private key怎么提供给request呢?可能我的理解有误,希望可以简单介绍一下怎么在这个gem里设置和使用RSA这个sign type。

Sign Verification failded for utf8 characters

For the create_direct_pay_by_user_url method, when the message contains unicode such as :subject => "珊瑚+x+1,", later notification verification will fail. The sign doesn't match with the one returned by Alipay.

return_url option for create_direct_pay_by_user_url?

Hi @chloerei, sorry for adding an issue when it is not necessarily one, I am just curious as it seems that, once the customer goes through the checkout process on Alipay, there is no redirection to the origin website (as would be the case with Paypal).

I'm not fluent in Chinese and I would like to see if you can confirm that behavior?

What I'd like is for Alipay to redirect to our merchant site once the direct pay transaction is completed but that's not what is happening even though I specified the return_url in the options...

Thanks for your help!

seller_email 并非必填参数

开发者文档中说明,seller_email 和 seller_id 两者填一个即可。email 并非必填参数,而且有的账户并没有 email。如果我在Rails起始时候不载入 Alipay.seller_email 的话,这个 gem 仍然会试图在参数中加入 &seller_email=''。空参数会在阿里侧造成签名错误,也就是 ILLEGAL_SIGN 错误。希望如果使用者没有给 Alipay.seller_email赋值的话,在发出请求时不要包括它。

支付宝是否没有“确认收货”接口?

我看文档中,这个gem并没有提供“确认收货”的接口,后面想着可以自己实现,然后提交到gem中,后面找了一遍文档也没有发现对应的接口。
难道说“担保交易”真的没有提供这样的接口?如果不走到支付宝页面手动点击“确认收货”的话,就只能等待自动结算了?

确认发货接口

hi @chloerei ,支付宝官方的 pdf 和你的 README 中,下面的接口都只需要两个参数就行了

Alipay::Service.send_goods_confirm_by_platform(
  trade_no: '201504010000001',
  logistics_name: 'example.com'
)

但是我实际测了一下,必须要加上 :transport_type => 'DIRECT' 才可以成功。

我觉得是支付宝那边的一个 bug ,你觉得呢?

logistics_type

在设置担保交易接口参数时,logistics_type 能设置为DIRECT吗?

支付宝response编码问题

irb> client = Alipay::Client.new(url: url,app_id: app_id,app_private_key: app_private_key,sign_type: 'RSA')
irb> client.execute(method: 'alipay.fund.trans.toaccount.transfer',biz_content: biz_content.to_json)
=> "{\"code\"=>\"40002\", \"msg\"=>\"Invalid Arguments\", \"sub_code\"=>\"isv.invalid-app-id\", \"sub_msg\"=>\"\\xCE\\xDE\x{D0A7}\\xB5\\xC4AppID\\xB2\\xCE\\xCA\\xFD\"}"

返回的sub_msg这里应该是中文的字符串

如何支持使用多个商户帐号?

有时会需要使用多个帐号,例如更换商户帐号的时候,新订单支付地址使用新帐号,旧的订单在一段时间内还需要处理异步消息。

方案一:

在现有方法上扩展,每个方法可以传入参数从而使用不同的帐号。

Alipay.pid = 'acount_1'
Alipay.seller_email = 'seller_email_1'
Alipay.key = 'key_1'

Alipay::Service.create_partner_trade_by_buyer_url(out_trade_no: 1000) # 使用 account_1

Alipay::Service.create_partner_trade_by_buyer_url(
  out_trade_no: 1000,
  pid: 'account_2',
  seller_email: 'seller_email_2,
  key: 'key_2'
) # 使用 account_2

如果要使用很多商户帐号,那么不设置默认值也可以。这个方案类似于 Stripe 的接口 https://stripe.com/docs/api/ruby

这个方案优势是改动小,api 基本不变,但是代码隔离不清晰。

方案二:

更改所有接口,需要先实例化:

alipay_1 = Alipay::Service.new(
  pid: 'acount_1',
  key: 'key_1'
)

alipay_2 = Alipay::Service.new(
  pid: 'acount_2',
  key: 'key_2'
)

alipay_1.create_partner_trade_by_buyer_url(..) # 使用 account_1

alipay_2.create_partner_trade_by_buyer_url(..) # 使用 account_2

这种方式类似于 dalli, redis-rb。

这个方案优势是代码隔离清晰,对象化,缺点是 api 全部要变更。

哪个方案比较好?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.