wordpress stripe 集成插件 powered by payaddons


继Stripe Express 之后,去年又新增了三款Stripe 插件,所以理所当然的需要整合一下,然后就创建了 https://payaddons.com 这个网站,希望能在branding 上提高产品知名度。

https://payaddons.com 是一个为 WordPress 用户提供 Stripe 支付集成解决方案的平台,旨在帮助网站所有者轻松接受多种支付方式,包括一次性和定期支付。该平台支持多种流行的 WordPress 工具,如 Elementor、Contact Form 7 和 WooCommerce,其产品设计简单易用,适合技术水平不同的用户。本报告将详细介绍 payaddons.com 的背景、产品功能、定价和支持,以及如何开始使用。

平台背景与概述

https://payaddons.com 是一个专注于 Stripe 支付插件的公司,目标是为 WordPress 用户提供无缝的支付集成体验。通过其插件,用户可以在不需复杂编码的情况下,在网站上添加支付功能,覆盖从页面构建到电商商店的多种场景。平台强调易用性、安全性和灵活性,适合小型企业、自由职业者和非营利组织。

产品详细介绍

Elementor Stripe Payment

Elementor Stripe Payment 是为 Elementor 页面构建器设计的支付插件,允许用户通过拖放方式创建支付表单。以下是其主要功能:

  • 信用卡字段:用户可以在表单中直接输入信用卡信息。
  • 支付元素字段:支持多种支付方式的综合字段。
  • Stripe 托管跳转:支付过程通过 Stripe 的安全页面完成,确保交易安全。
  • 结账按钮:支持优惠券、Stripe 税费、一次性和定期支付,可自定义品牌风格,并支持 EPS、Giropay、Sofort、iDeal、Alipay、Apple/Google Pay 和 WeChat 等多种支付方式。
  • 高级价格表小部件:提供 Elementor 风格的价格表,并集成结账功能。
  • 定价方面,提供免费版本(包括基础结账表、一次性支付按钮等)

Contact Form 7 Stripe Addon

Contact Form 7 Stripe Addon 允许用户在 Contact Form 7 联系表单中添加支付字段,适合需要通过表单接受支付的场景。功能包括:

  • 支持一次性和定期支付。
  • 通过 Stripe 托管页面完成支付跳转,确保安全。
  • 适合销售产品、服务或接受捐款的网站。

WooCommerce Stripe Payment

WooCommerce Stripe Payment 针对电商用户,增强 WooCommerce 商店的支付功能。关键特点:

  • 添加超过 30 种支付方式,包括 Google Pay 和 Apple Pay。
  • 易于集成现有 WooCommerce 设置,适合在线商店。

Stripe Express

Stripe Express 是一个独立小部件,适合无需完整在线商店的支付场景。功能包括:

  • 支持一次性和定期支付。
  • 可嵌入网站任意页面,灵活性高。
  • 适合小型项目或临时支付需求

功能与优势

payaddons.com 的产品具有以下共同优势:

易用性:安装和配置简单,适合技术水平不同的用户。
安全性:利用 Stripe 的安全支付处理,确保交易安全。
兼容性:与多个 WordPress 插件和页面构建器兼容,覆盖广泛使用场景。
支持与保证:提供优先邮件和 Skype 支持(机构版),并有 100% 退款保证,如果插件不可用且问题无法解决,可全额退款。
用户评价显示,插件轻量级、易用,免费版本功能丰富,适合初创企业。例如,一位用户评论称,“这款插件非常适合在 Elementor 表单中添加支付选项,安装简单,功能强大”。

定价与支持

Elementor Stripe Payment:免费版包括基础功能和专业版。
其他产品:Contact Form 7 和 WooCommerce 插件也有免费版本,具体定价需参考 payaddons.com
退款政策:所有产品提供 100% 退款保证,续费价格不会因订阅未取消而增加。
支持方面,机构版用户可享受优先邮件和 Skype 支持,免费版用户可通过网站获取文档和社区支持。

如何开始使用

要开始使用 payaddons.com 的插件,步骤如下:

访问 payaddons.com,选择适合你的产品。

  1. 下载插件(免费版可直接下载,付费版需购买)。
  2. 按照安装说明在 WordPress 仪表盘中安装和激活。
  3. 配置 Stripe 账户,设置支付方式,几分钟内即可开始接受支付。

结论

https://payaddons.com 是一个值得信赖的平台,为 WordPress 用户提供高效的 Stripe 支付集成解决方案。其产品覆盖多种场景,功能丰富,免费版本已满足基本需求,付费版本则提供更多支持和高级功能。无论是小型网站还是电商商店,payaddons.com 都能帮助你轻松实现支付功能。

如需额外功能或定制,请联系本人。

Top

JS实现一个复杂sticky效果

最近工作上遇到一个需要:一个产品列表的下, 当浏览器滚动到每个产品上时,需要将产品title sticky 到顶部,紧接着产品描述也sticky 到title 下部分,产品里的一个按钮则需要sticky 到底部,当产品滚动完成后,紧接着下一个产品的sticky。

看似很简单的需求,本以为通过css position: sticky 可以很快完成,没想到遇到了一茬接一茬的问题:

  1. 首先每一个sticky 的元素style 会变化,例如字体或者边框,这就需要知道什么时候是处于sticky 状态,然后css 的sticky 是没有这样的状态选择器
  2. 还是利用css sticky,只是使用 IntersectionObserver 来检测是否处于sticky 状态,如果是,那就加一个class 应用 style 的变化
  3. 按着思路,做出来的有个新问题:当滚动到第一个产品底部,刚好第二个产品顶部时,sticky收缩回原始位置的时候,又导致父元素高度变化,此时又触发sticky 条件,导致触发sticky,然而,sticky生效时,父元素高度又变小,又触发sticky收缩。。。所以sticky 闪烁的问题出现了

#2 中的 detectSticky 可以用IntersectionObserver 实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function detectSticky(element, onPin, onUnpin) {
var observer = new IntersectionObserver(
function(entries) {
var entry = entries[0];
if (entry.intersectionRatio < 1) {
onPin();
} else {
onUnpin();
}
}.bind(this),
{ threshold: [1] }
);

observer.observe(element);
return () => observer.disconnect();
}

如果要实现一个通用的任意元素的sticky 效果,可使用下面的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function createSticky(element, position = 'top', offsetY = 0) {
var isPinned = false;
var spacer = null;

var observer = new IntersectionObserver(
(entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
window.addEventListener('scroll', checkSticky);
checkSticky();
} else {
window.removeEventListener('scroll', checkSticky);
if (isPinned) unpin();
}
});
},
{ threshold: [0], rootMargin: '0px' }
);

function createSpacer() {
var height = element.offsetHeight;
spacer = document.createElement('div');
spacer.className = 'sticky-spacer';
spacer.style.height = height + 'px';
spacer.style.opacity = 0;
element.parentNode.insertBefore(spacer, element);
}

function pin() {
if (!spacer) createSpacer();
element.classList.add('is-sticky');
isPinned = true;
}

function unpin() {
element.classList.remove('is-sticky');
if (spacer) {
spacer.remove();
spacer = null;
}
isPinned = false;
}

function checkSticky() {
if (!element.parentElement) {
unpin();
return;
}

var rect = element.parentElement.getBoundingClientRect();
var shouldPin = position === 'top'
? rect.top < -offsetY && rect.bottom > offsetY
: rect.bottom > window.innerHeight + offsetY && rect.top < window.innerHeight;

if (shouldPin && !isPinned) pin();
else if (!shouldPin && isPinned) unpin();
}

observer.observe(element.parentElement);
return () => observer.disconnect();
}

最终方案还有一个可改进的地方,由于 title 是触顶触发sticky,如果title 内容本身很高,spacer 的空白会比较明显,可以改为title 底部触顶触发, 只需要把 rect.bottom > offsetY 改为 rect.bottom > 0

image

最后,平平无奇的一篇技术小点为何要写呢?最主要的是上面的最终成品是我在 claude.ai 帮助下完成,包括生成demo,重构代码,不得不感叹于 AI 真的改变程序生活

Top
Top
Top
Top
Top
Top

中国用户如何免费激活Stripe?

中国用户如何免费激活Stripe?

本文会介绍无需开设海外银行账号或者香港账号,并免费的通过注册激活Stripe账号并提现,亲测有效!

主要通过使用万里汇海外账号绑定激活,其中万里汇是蚂蚁金服旗下的产品,值得可靠。(不是给万里汇打广告哦)

什么是Stripe

想象你是一个跨境电商,想要把产品卖到全球,却面临一个问题,商品标价$100,日本客户想直接支付日元,欧洲客户想支付欧元。。。你不可能要求客户说我只支持美元,请兑换后再支付吧?

所以如果你还不知道Stripe,那推荐你去了解下。作为和PayPal一样存在的支付巨头(现在市值 $950亿),在国外早已火得一塌糊涂,使用他作为支付平台的商家和网站数不甚数,消费者渗透率覆盖了全球135个国家。。。

中国商户,NO

遗憾的是,如果你是身在中国,那么是不能激活Stripe 账号的(不激活只是注册账号倒是可以,但是没法收款和体现,只能测试),可以查看现在商户支持的40多个国家/地区列表, 其中香港是可以的。所以你能看到,这个注册公司地址里是没办法选择中国🇨🇳的,That’s the problem!

如果解决?万里汇 或者 TransferWise

问题的瓶颈在于stripe 激活的时候,需要提供你的商业信息以及银行信息,并且保证银行上的名字和账号里的个人姓名一致。但又由于商业信息的国家地区只有上面提到的,所以也就导致中国用户没办法激活。

解决办法的思路就是,使用万里汇注册个香港账号或者其他国家的银行账号(虽说是虚拟的,但和实际没区别),然后再根据账号的信息拿去Stripe激活,看似简单,但还有很多坑需要趟,且听我慢慢道来。


注册万里汇

点击注册地址 https://portal.worldfirst.com.cn/register

  1. 然后按步骤选择支付网关, 这里可以按个人情况多选几个(最好把stripe 勾选上),虽然我也不知道有多大影响

  1. 选择类型,可以是个人, 也可以是公司,这里我选的个人

  2. 填写基本信息,按部就班的填好就行,注册就算成功

认证账号

注册好了,是非认证状态的,这时是不能创建海外账号,还需要提供相应的信息上传去验证(据说可以支付宝快捷验证,但是我没发现有,只能拍照上传)

认证一般会持续一两天验证,等着收邮件就好了,如果有问题,可以联系自己的万里汇客户经理(真是一对一服务啊,这点好)

创建海外货币账户

终于到了关键步骤了,这里可以创建多个账户,每个账户就像自己银行卡一样,有卡号,为了stripe 注册方便,我创建了一个香港账户和一个美国账户

到了这一步,恭喜你,你已经开通了海外账户!关键是这个银行信息对后面的Stripe激活是非常重要。


创建和激活 Stripe 账号

首先创建Stripe 账号,https://dashboard.stripe.com/register, 国家/地区可以选择香港,创建好之后,登录进入主页面, 这个时候如果你暂时不想激活,是完全可以的,可以切换测试模式进行你的支付开发测试,测试模式基本和在线模式一模一样,除了测试的支付账号是假的以外 (PS, 我就是没激活使用了一年多,纯粹作为开发使用)

激活Stripe 账户

点击 激活你的账户 , 这里看起来有很多步骤,不用怕填错,后面都是可以跳回去改的。

公司结构:

选择香港,或者其他上面货币账号国家,地址可以填银行账号地址,类型可以选个人(如果公司的话,据说stripe 会对你账号保护性或者服务更好),点击下一步

公司代表:必须是你自己在上述银行账号的姓名,否则可能会无法体现到你银行

地址信息可以继续用银行地址,电话号码最好是用中国的,可以选CN, 填写自己号码,因为后面可能会用来用来登录短信验证之类的,身份证ID 这个我没记错的话,是随便找的一个ID(只要位数和格式对了就行) ☹️

银行详情:选择在万里汇创建的银行信息就行

然后一直填下去,保存

激活成功了吗?

上述没问题的话,确实激活成功了,你也可以切换到线上模式去收款了,但是却无法提现(转账)到你银行卡里,还有两个重要的未完成步骤警告:

身份信息不匹配(个人信息验证失败,当然了,ID 都是假的) 和 US Tax Form (美国税收表)

两个问题一个一个解决:

  • ID 不匹配,进入提示的配置,只需要上传自己的身份证正反面就好了,一天左右就验证成功(不知道如何验证的,可能是后台人工验证,保证姓名一致就行,所以一定上传自己真实的身份证就,地址用自己中国地址)
  • W-8 form,一定要选非美国居民(勾选No),然后点击提交,会被导航至表单填写页面,基本信息stripe 已经帮你预填了,只需要签上个人姓名就好了

documents-for-identity-and-home-address-verification

w-8-forms-collected-by-stripe

等着这两个错误完成后,这个账号就算真正激活完成,并可以完成提现(每天,并且非常快)。


万里汇提现到人民币(成功)

现在万里汇香港账号已经有收到的港币了,但如果需要的话,需要转为人民币(可转到支付宝),但根据万里汇客户经理说明,这是需要提供相应凭据,也就是stripe 或者 paypal 上的支付记录,表明来历明确。提现过一次,因为金额不大,并且提供了paypay 的收款记录,所以成功提现。

特别提醒的是,这篇文章目的只是为激活stripe指南, 不为跨境转账成功负责,请酌情选择。

特此声明,本文禁止转载至除 troyyang.com, itstripe.com 以外的网站

相关推荐文章:
wordpress stripe插件,支持微信和支付宝
stripe集成 微信和支付宝

Top

Wordpress 插件 Stripe Express 发布啦!


Stripe Express 是什么?

简单来说,Stripe Express 是一款针对wordpress 平台,帮助你使用 stripe 快速,方便完成跨境支付的一款免费插件(扩展功能收费)。其中,包括多种已经创建好的支付组件,包括一次性支付(one-time),电子钱包(支付宝,微信,Apple Pay, Google Pay,下面重点会提到微信和支付宝),表单支付等等组件,需要提及的是,上面的组件都支持常见的各种信用卡,Master card, Visa, 等等等等,以及其他国家地区的主流支付方式比如 Bancontact, FPX, EPS, SEPA, Giropay, Sofort, iDeal。

所以,只有你有一个 Stripe 的账号,那么超过三十多个国家地区的客户都可以向你支付(对于微信和支付宝,你无需申请支付宝或者微信的商家账号,即可免费收款)。

问题: 什么人更需要这个组件?
回答: 现阶段,因为还没集成woocommence, 所以如果你没有一个完整的电子商务网站比如使用 woocommence搭建,只是一个简单的Wordpress 网站,但是你又有自己的产品或者服务需要销售,而你只是想你用户简单的点击购买,付款。

wordpress 插件传送门

itstripe.com

在我们国内,大部分人肯定知道Paypal,却不知道Stripe,更别说用过,当然也和Stripe 暂不支持中国商家的原因分不开。殊不知,国外Stripe普及程度远大于我们的想象,很多网站都会加上对Stripe 的支持,因为这意味着你的网站可以面向全世界超过30个主要国家的客户收费,包括中国!所以想要做跨境支付的话,Stripe 你必须要熟悉!

众所周知,Wordpress全世界超过40%的网站都是他创建的,而且现在也依旧火爆。再加上之前很多朋友都在咨询我关于 stripe 在wordpress上的问题,所以主要侧重点会是在 stripe express 这款插件上。其次,网站会包括产品介绍,以及插件的文档,还有和stripe 相关集成服务,如果你有集成这方面的需求的话,或者Web 的支付开发,可以联系我们。

Stripe,微信 和 支付宝

这是一个最重要的原因之一促使我想要做这么一个东西。有这么一部分人:1. 小商家或者个人网站用户想要接入微信或者支付宝,方便国内用户收费,2. 国外的中小网站想要针对中国用户微信和支付宝收费。但是对于他们而言,由其老外,要想接入微信或者支付宝支付接口,门槛还是有点高,需要去申请商家账号

stripe 却在这方面有着天然优势,由于已经和alipay 和 wechat 达成协议,Stripe 完全可以实现上面的收费,其中stripe 会收取3.4% + $0.50每笔的服务费。

之前写过一篇关于 stripe集成 微信和支付宝的文章,反响挺大的,看到很多评论和转载,也收到很多咨询的邮件,但是之前的那篇从技术角度其实有点老了,我会另外抽时间重新写一个更通用的集成方式(已经在这款插件中实践了)

后续

回想这半年多的开发时间(包括插件和官网),白天正常上班,晚上继续开发,连周末都不想出门,像打鸡血一样的完善产品,终于迎来了发布的日子。无论这款插件将来如何,安装量怎样,有过这么一段为了某个目标而全力以赴的日子也是极好的!

Top

Mobx在项目中的实践 及 与Redux的比较

之前在公司FEE内部做过一次技术分享,主要关于Mobx在项目中的使用一年后的体验以及和Redux 的一些比较(因为我们项目之前的状态管理选型选择的是mobx,而其他项目组的同学选择主要是Redux或者还在纠结如何选)。

以下都是根据查询各种资料后的个人理解概览

Mobx Overview

Mobx looks like a properties tracking and reaction lib.
基础部分就省了,只说结论:Mobx 看起来是属性追踪及作出相应反应的库,和Redux 不一样的是,他的状态是mutable的。

Mobx 4 & 5

  • Mobx 4 Limitations (Observable)
  • Mobx 5 Proxy based (Only ES 6 Browser, no polyfill)

Mobx & Third-Party view lib

  • mobx & mobx-react
  • redux & react-redux
  • mobx & mobx-arch & mobx-backbone 有吗???

Mobx 是可以单独使用的,这点和Redux一样,可以不需要依赖于任何UI 库像,React, Vue,当然如果把他们结合到一起,那才能发挥出最大的作用,所以就理所应当的有mobx-react。

我们公司内部有个UI 库叫arch,很老的了,requirejs时代的,比react, vue, angular还早,没有响应式的更新,核心只有一个render 方法,所以其实可以通过Mobx 简单改造为响应式的,一旦外部属性发生变化,就会触发重新渲染,至于内部状态嘛,呵呵,不考虑了,反正这只是个例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var { observable, autorun } = require("mobx");
var Entity = require('xx/xxxx/entity');

var todoStore = observable({
todos: [],
get completedCount() {
return this.todos.filter(todo => todo.completed).length
}
})

autorun(function () {
// For Backbone
this.xxxBackBoneComponent = new Entity({
model: todoStore.todos,
editable: true
});

// For Arch
active.render($html, () => {
this.xxArchComponent = arch.getComponent(xxx);
});
})

todoStore.todos[0] = {
title: "Take a walk",
completed: false
}

Mobx Store Design

这是我觉得最难的部分,如何设计好Mobx的Store?官方给出的一个guide 是划分为Domain store 和 UI store。Domain store和Redux的one-single store 可不一样,这里是可以有多个的,像users, books, movies, orders 都可以是一个Domain Store, 至于UI store,暂时我们只是存储一些全局的属性。所以,我们的项目中Store的结构大致如下:

1
2
3
4
5
6
7
stores
--root.ts
--domain
----aaaStore.ts
----bbbStore.ts
--ui
----application.ts

root.ts初始化所有domain和ui store:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
export default class RootStore {
@observable
aaStore;

@observable
bbStore;

@observable
applicationUIStore;

constructor() {
// Domain Store Init
this.aaStore = new AStore(this);
this.bbStore = new BStore(this);
...

// UI Store Init
this.applicationUIStore = new ApplicationUIStore(this);
...
}
}

但是在实际的问题中,我们发现大部分的状态其实都是本地UI状态,(也许有人说用setState啊,如果业务复杂,状态很多, 并且基本会依赖其他store,最好抽出来)所以,问题来了,这些ui store我们放在哪里呢?同时,我们需要把Container 组件里的状态隔离开来,为什么隔离,一是因为UT 不好写(因为有inject,所以在UT里需要写很多Provider),二是傻瓜组件更不容易出错,参考Redux的connect用法,我们得到下面的结构:

1
2
3
ContainerAComponent
--ContainerAComponent.tsx
--ContainerAComponentUIStore.ts

ContainerAComponentUIStore.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
export default class ContainerAComponentUIStore {
rootStore;
constructor(rootStore) {
this.rootStore = rootStore;
}

@observable
addHoc = '';

@action.bound
onAdhocChange = (addHocNewValue) => {
....
}

ContainerAComponent.tsx

1
2
3
4
5
6
7
export class ContainerAComponent extends React.Component {
handleAdhocChange = (e) => {
this.props.onAdhocChange(e.target.value);
}
...
}
export default connectComponentStore(ContainerAComponent, ContainerAComponentUIStore);

这样,我们导出了两个组件,一个是ContainerAComponent,就是一个简单组件,我们可以通过传统传props的方式去测试组件核心内容,另一个是HOC组件,其实是不用测试的。

而至于connectComponentStore方法,就是一个很简单的HOC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
export default (WrapperedComponent, ComponentStore) => {
@inject('appStore')
@observer
class Connect extends React.Component {
@observable componentStore;

constructor(props) {
super(props);
this.componentStore = new ComponentStore(props.appStore);
this.ref = createRef();
}

static displayName = `${WrapperedComponent.displayName || WrapperedComponent.name}-withUIStore`

componentDidMount() {
this.componentStore.mapState(this.props);
}

componentDidUpdate(preProps, preState) {
this.componentStore.mapState(this.props);
}

render() {
return (<WrapperedComponent ref={this.ref} {...this.componentStore.toProps} {...this.props} />);
}
}

return Connect;
};

我们业务里,绝大部分都是用到的这种本地UI Store + 简单组件组合这种方式,也许就是所谓的local state component (忘了哪里听到的了)

Mobx-State-Tree(MST)

也许MST在大型项目中使用是个很好的方式,但我们暂时还没有去尝试。

Project Structure

下面是Mobx的一些项目组织结构参考资料:

https://medium.com/@daniel.bischoff/how-to-structure-your-mobx-react-app-8fd6d9d821a4
https://github.com/gothinkster/react-mobx-realworld-example-app

Mobx-React vs Redux-React

个人简单的一些看法:

  • Workflow
  • Freestyle vs Strict
  • OOP styles vs FP
  • Small vs Large
  • Time-traval problem (Resolved by MST)
  • Container components (Inject vs Connect)
  • redux-crud-example & mobx-crud-example

https://medium.com/@cameronfletcher92/mobdux-combining-the-good-parts-of-mobx-and-redux-61bac90ee448
https://www.sitepoint.com/redux-vs-mobx-which-is-best/

Learning Redux

在一些小项目中用过Redux, 不得不说,Redux的学习成本要比Mobx高得多,比如下面的点,
redux, reducer, action, container component, selectors(reselect), redux-thunk, normalizing, ducks, and more waiting…

Mobx-Best-Practice

Decorator (ES7/TS) vs no-decorators

End

如果你有更好Mobx使用的一些心得,欢迎交流!

Top