{"id":332728,"date":"2026-07-04T06:40:11","date_gmt":"2026-07-04T06:40:11","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/blueforce-manual-payments-for-twint\/"},"modified":"2026-07-04T07:47:30","modified_gmt":"2026-07-04T07:47:30","slug":"blueforce-manual-payments-for-twint","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/blueforce-manual-payments-for-twint\/","author":13901891,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.0","stable_tag":"1.5.0","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Blueforce Manual Payments for TWINT","header_author":"Blueforce Digital Solutions","header_description":"Manuelle TWINT-Bezahlmethode f\u00fcr WooCommerce ohne TWINT-API \u2013 Zahlungen werden von Hand abgeglichen und best\u00e4tigt.","assets_banners_color":"c9cdd7","last_updated":"2026-07-04 07:47:30","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/blueforce\/blueforce-manual-payments-for-twint","header_author_uri":"https:\/\/blueforce.ch","rating":0,"author_block_rating":0,"active_installs":0,"downloads":39,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.4.3":{"tag":"1.4.3","author":"worshipper","date":"2026-07-04 06:39:51"},"1.5.0":{"tag":"1.5.0","author":"worshipper","date":"2026-07-04 07:47:30"}},"upgrade_notice":{"1.4.0":"<p>Renamed and prepared for the WordPress.org plugin directory; the GitHub-based update mechanism was removed (no more external calls). No functional changes.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3595732,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3595732,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3595732,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3595732,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3595732,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.4.3","1.5.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[131407,6593,9090,193458,286],"plugin_category":[45],"plugin_contributors":[270050],"plugin_business_model":[],"class_list":["post-332728","plugin","type-plugin","status-publish","hentry","plugin_tags-manual-payment","plugin_tags-payment-gateway","plugin_tags-switzerland","plugin_tags-twint","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-worshipper","plugin_committers-worshipper"],"banners":{"banner":"https:\/\/ps.w.org\/blueforce-manual-payments-for-twint\/assets\/banner-772x250.png?rev=3595732","banner_2x":"https:\/\/ps.w.org\/blueforce-manual-payments-for-twint\/assets\/banner-1544x500.png?rev=3595732","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/blueforce-manual-payments-for-twint\/assets\/icon.svg?rev=3595732","icon":"https:\/\/ps.w.org\/blueforce-manual-payments-for-twint\/assets\/icon.svg?rev=3595732","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>This plugin adds a TWINT payment method to WooCommerce. The <strong>plugin itself<\/strong> needs no TWINT API, no acquiring contract and no payment service provider \u2013 it uses the manual TWINT process (send or request money by mobile number) and is therefore suited to small shops, clubs and sole traders. You remain responsible for complying with your own TWINT, bank and business terms for commercial use.<\/p>\n\n<p>TWINT does not offer its payment API publicly. An automated integration is only possible through a TWINT acquiring contract or a payment service provider. This plugin deliberately takes the manual route, so you can start without a TWINT integration contract while still meeting your own TWINT and bank conditions.<\/p>\n\n<h4>Two workflows<\/h4>\n\n<ul>\n<li><strong>Customer sends:<\/strong> The customer is shown your TWINT mobile number and, optionally, your QR code. They send the amount using the order number as the message.<\/li>\n<li><strong>I request:<\/strong> The customer enters their TWINT mobile number; you request the amount in the TWINT app.<\/li>\n<\/ul>\n\n<p>In both cases the order is set to \"On hold\" and the incoming payment is confirmed by hand.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Classic and block checkout<\/li>\n<li>Optional TWINT QR code on the thank-you page and in the email<\/li>\n<li>HPOS compatible<\/li>\n<li>Translation-ready; German, English, French (CH) and Italian (CH) translations included<\/li>\n<li>No external dependencies, no tracking, no phone-home calls<\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<p>In the \"I request\" workflow the plugin stores the TWINT mobile number provided by the customer as order metadata (<code>_bf_twint_customer_phone<\/code>) in order to request the payment via the TWINT app. This number is included in the WooCommerce\/WordPress data export and erasure tools. No data is sent to third parties and no external services are contacted; payment reconciliation is done manually in the TWINT app.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload and activate the plugin.<\/li>\n<li>Open WooCommerce \u2192 Settings \u2192 Payments \u2192 TWINT.<\/li>\n<li>Enable it, choose a workflow and configure it.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20contract%20with%20twint%3F\"><h3>Do I need a contract with TWINT?<\/h3><\/dt>\n<dd><p>The plugin itself needs no TWINT API key, acquiring contract or payment service provider \u2013 it uses the manual TWINT process. Please note that the terms of your TWINT, bank and merchant account still apply: if you accept payments commercially, check your own TWINT and bank conditions for business use.<\/p><\/dd>\n<dt id=\"is%20the%20payment%20verified%20automatically%3F\"><h3>Is the payment verified automatically?<\/h3><\/dt>\n<dd><p>No. The incoming payment is checked in the TWINT app and the order is set to \"Processing\" by hand.<\/p><\/dd>\n<dt id=\"is%20this%20plugin%20official%20twint%20software%3F\"><h3>Is this plugin official TWINT software?<\/h3><\/dt>\n<dd><p>No. It is an independent community project by Blueforce Digital Solutions and is not affiliated with TWINT AG. \"TWINT\" is a registered trademark of TWINT AG and is used here only to describe compatibility.<\/p><\/dd>\n<dt id=\"what%20personal%20data%20is%20stored%3F\"><h3>What personal data is stored?<\/h3><\/dt>\n<dd><p>Only in the \"I request\" workflow: the TWINT mobile number the customer enters at checkout (as order metadata, used solely to request the payment). It is included in the WordPress data export and erasure tools; a suggested privacy policy snippet is available under Settings \u2192 Privacy. In the \"Customer sends\" workflow, no personal payment data is collected.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.0 \u2013 wordpress.org Welcome Release!<\/h4>\n\n<ul>\n<li>Internationalisation: the plugin now uses English source strings, with German, French (CH) and Italian (CH) shipped as proper translations. This lets translate.wordpress.org handle translations correctly \u2013 the previous German source strings prevented that. No functional changes.<\/li>\n<\/ul>\n\n<h4>1.4.3<\/h4>\n\n<ul>\n<li>Wording: clarified that the plugin itself needs no TWINT API key or acquiring contract, while shop operators remain responsible for their own TWINT, bank and merchant terms for commercial use.<\/li>\n<li>Removed \"TWINT logo\" phrasing from older changelog notes to avoid trademark ambiguity; the plugin icon is a custom Blueforce design.<\/li>\n<li>Updated the translation template and metadata to the current version.<\/li>\n<li>Hardening: the selected workflow (send\/request) is normalised to a known value on load and save; block checkout data is sanitised before it is passed to the front end.<\/li>\n<li>Packaging\/CI: the build script now verifies that development, test, repo and WordPress.org asset folders never end up in the distributed plugin ZIP; PHP lint is limited to the actual plugin files.<\/li>\n<li>Cleanup: added uninstall.php so deleting the plugin removes its stored gateway settings (order data is kept).<\/li>\n<li>Consistency: aligned the license notation between the plugin header and readme, and updated remaining internal doc comments to the current plugin name.<\/li>\n<li>Privacy\/hardening: in the \"Customer sends\" workflow the block checkout no longer stores a customer phone number server-side, even if a manipulated client submits the field \u2013 matching the classic checkout and the stated privacy behaviour.<\/li>\n<\/ul>\n\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>Coding standards: renamed the gateway class to use the plugin prefix (BF_TWINT_Gateway).<\/li>\n<li>Header: shortened the plugin description to under 140 characters, added \"Requires Plugins: woocommerce\", and updated \"WC tested up to\".<\/li>\n<li>Packaging: include composer.json in the distributed plugin; keep GitHub-only docs (README.md, CHANGELOG.md) out of the ZIP.<\/li>\n<li>No functional changes.<\/li>\n<\/ul>\n\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Security\/hardening: escape settings field output late with wp_kses_post() (tooltip and description HTML in the QR image field); removed the corresponding phpcs:ignore annotations. No functional changes.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Renamed to \"Blueforce Manual Payments for TWINT\" and prepared for the WordPress.org plugin directory.<\/li>\n<li>Removed the previous GitHub-based update mechanism; the plugin no longer makes external calls.<\/li>\n<li>No functional changes to checkout, workflows or privacy.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Order snapshot: workflow, number, account holder, QR image and notes are frozen per order \u2013 thank-you page, email and admin stay correct even if the settings are changed later.<\/li>\n<li>Block checkout: TWINT is now correctly hidden for foreign currencies (as in the classic checkout).<\/li>\n<li>Privacy: customer number is included in data export\/erasure; privacy policy snippet added.<\/li>\n<li>Admin notice for incomplete configuration; real plain-text email; centralised phone validation\/normalisation.<\/li>\n<li>Accessibility improvements; inline styles moved to CSS; \"Mark as paid\" button restricted to authorised roles, with a logged note.<\/li>\n<li>CI: PHP lint, WordPress Coding Standards and ZIP build test.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>\"Mark as paid\" button in the order screen: release a TWINT order as paid with one click.<\/li>\n<li>French (fr_CH) and Italian (it_CH) translations \u2013 including block checkout.<\/li>\n<li>Copy button for the order number on the thank-you page (fewer typos in the TWINT message).<\/li>\n<li>TWINT is only shown when the shop currency is CHF (filter \"bf_twint_is_available\" to override).<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Security: additional capability check (manage_woocommerce) when loading the admin scripts.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Plugin icon shown in the plugin list.<\/li>\n<li>English translations (en_GB\/en_US) added for the new admin texts (QR image selection).<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>TWINT QR image: select directly from the media library via a button (instead of typing a URL), with preview.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Block checkout: payment method icon next to the method name and required-field marker (\"*\") on the mobile number.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Internal improvements.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Manual TWINT payment method for WooCommerce \u2013 the plugin needs no TWINT API or acquiring contract. Payments are confirmed by hand.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/332728","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=332728"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/worshipper"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=332728"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=332728"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=332728"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=332728"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=332728"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=332728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}