<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: KachingQR</title>
    <description>The latest articles on DEV Community by KachingQR (@kachingqr).</description>
    <link>https://dev.to/kachingqr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4189380%2F68e58695-efae-40af-90f0-a9e59c808927.png</url>
      <title>DEV Community: KachingQR</title>
      <link>https://dev.to/kachingqr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kachingqr"/>
    <language>en</language>
    <item>
      <title>How a PayNow QR code works: the payload, field by field</title>
      <dc:creator>KachingQR</dc:creator>
      <pubDate>Tue, 20 Oct 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/kachingqr/how-a-paynow-qr-code-works-the-payload-field-by-field-2h5a</link>
      <guid>https://dev.to/kachingqr/how-a-paynow-qr-code-works-the-payload-field-by-field-2h5a</guid>
      <description>&lt;p&gt;A PayNow QR code looks like a picture, but it holds plain text. A bank app reads that text, shows the payer who they are paying and how much, and sends the money. Nothing is stored in the QR code that you could not print on a name card.&lt;/p&gt;

&lt;p&gt;This guide explains that text: what each part means, how the check at the end works, and the small mistakes that make a bank app refuse a code. Every field below was checked against PayNow QR codes made by a Singapore bank app.&lt;/p&gt;

&lt;h2&gt;
  
  
  The payload is a list of small blocks
&lt;/h2&gt;

&lt;p&gt;The text is a chain of blocks. Each block has three parts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ID&lt;/td&gt;
&lt;td&gt;2 digits&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;59&lt;/code&gt; (payee name)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Length&lt;/td&gt;
&lt;td&gt;2 digits&lt;/td&gt;
&lt;td&gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;that many characters&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SUNNY DAY KOPI&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So &lt;code&gt;5914SUNNY DAY KOPI&lt;/code&gt; means: field 59, 14 characters long, value "SUNNY DAY KOPI". This format is called TLV (tag, length, value), and it comes from the EMVCo QR code standard that many countries use for payment QR codes.&lt;/p&gt;

&lt;p&gt;Two rules follow from this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A value can be at most 99 characters, because the length has only two digits.&lt;/li&gt;
&lt;li&gt;The length counts characters, so it must be exact. One wrong length breaks every block after it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some blocks hold other blocks inside them. Field &lt;code&gt;26&lt;/code&gt; (who gets paid) and field &lt;code&gt;62&lt;/code&gt; (extra data) work this way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every field in a PayNow QR code
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;00&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Payload format&lt;/td&gt;
&lt;td&gt;Always &lt;code&gt;01&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Point of initiation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;26&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Who gets paid&lt;/td&gt;
&lt;td&gt;A block of blocks (see below)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;52&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Merchant category code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;53&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Currency&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;702&lt;/code&gt; (Singapore dollars)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;54&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Amount&lt;/td&gt;
&lt;td&gt;Optional, for example &lt;code&gt;4.50&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;58&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Country&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SG&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;59&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Payee name&lt;/td&gt;
&lt;td&gt;Up to 25 characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;60&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;City&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Singapore&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;62&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Extra data&lt;/td&gt;
&lt;td&gt;Optional block; &lt;code&gt;01&lt;/code&gt; inside it is the reference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;63&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check value (CRC)&lt;/td&gt;
&lt;td&gt;4 characters, always last&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Field 26: who gets paid
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;00&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scheme&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SG.PAYNOW&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Proxy type&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0&lt;/code&gt; for a mobile number, &lt;code&gt;2&lt;/code&gt; for a UEN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Proxy&lt;/td&gt;
&lt;td&gt;a mobile number in the form &lt;code&gt;+65XXXXXXXX&lt;/code&gt;, or the UEN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Can the payer change the amount?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt; = yes, &lt;code&gt;0&lt;/code&gt; = no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Expiry date&lt;/td&gt;
&lt;td&gt;Optional, &lt;code&gt;YYYYMMDD&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The proxy is the mobile number or UEN that is registered for PayNow. The bank app looks it up and shows the registered name, so the payer can check it before paying.&lt;/p&gt;

&lt;h3&gt;
  
  
  Field 62: the reference
&lt;/h3&gt;

&lt;p&gt;Inside field &lt;code&gt;62&lt;/code&gt;, sub-field &lt;code&gt;01&lt;/code&gt; holds a reference such as an invoice number. Bank apps show it to the payer and pass it to the payee, which makes it much easier to match payments.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example
&lt;/h2&gt;

&lt;p&gt;A business with UEN &lt;code&gt;201912345K&lt;/code&gt; wants a code for S$4.50, reference &lt;code&gt;INV-1001&lt;/code&gt;, amount fixed, valid until 31 December 2026.&lt;/p&gt;

&lt;p&gt;Field 26 first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0009SG.PAYNOW      scheme
01012              proxy type: UEN
0210201912345K     proxy
03010              amount cannot be changed
040820261231       expiry date
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wrapped as field 26 (the inner blocks add up to 49 characters):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;26490009SG.PAYNOW010120210201912345K03010040820261231
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;00020101021126490009SG.PAYNOW010120210201912345K0301004082026123152040000530370254044.505802SG5914SUNNY DAY KOPI6009Singapore62120108INV-10016304204C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last 4 characters, &lt;code&gt;204C&lt;/code&gt;, are the check value.&lt;/p&gt;

&lt;h2&gt;
  
  
  The check value at the end
&lt;/h2&gt;

&lt;p&gt;Field &lt;code&gt;63&lt;/code&gt; is a CRC: a short number made from all the text before it. If one character changes, the CRC changes, and the bank app rejects the code instead of paying the wrong person or amount.&lt;/p&gt;

&lt;p&gt;PayNow uses CRC-16/CCITT-FALSE (polynomial &lt;code&gt;0x1021&lt;/code&gt;, start value &lt;code&gt;0xFFFF&lt;/code&gt;). The detail that catches most people: &lt;strong&gt;the CRC covers the text &lt;code&gt;6304&lt;/code&gt; too.&lt;/strong&gt; You add &lt;code&gt;6304&lt;/code&gt; (ID 63, length 04), calculate the CRC over everything so far, then append the 4 hex characters in upper case.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;tlv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%02d'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;crc16&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$crc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0xFFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$crc&lt;/span&gt; &lt;span class="o"&gt;^=&lt;/span&gt; &lt;span class="nb"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$bit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$bit&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$bit&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$crc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$crc&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0x8000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;$crc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mh"&gt;0x1021&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xFFFF&lt;/span&gt;
                &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$crc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xFFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%04X'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$crc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'...all fields...'&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;'6304'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$payload&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;crc16&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mistakes that can make a bank app refuse the code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A wrong length.&lt;/strong&gt; Count characters, not bytes you think you typed. A trailing space in the name changes the length.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The CRC calculated without &lt;code&gt;6304&lt;/code&gt;.&lt;/strong&gt; The code looks fine but no bank app accepts it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A lower-case CRC.&lt;/strong&gt; Use upper-case hex, as the standard does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A mobile number without &lt;code&gt;+65&lt;/code&gt;.&lt;/strong&gt; Use the full &lt;code&gt;+65&lt;/code&gt; form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An amount with a thousands separator or a currency sign.&lt;/strong&gt; &lt;code&gt;1250.00&lt;/code&gt; works; &lt;code&gt;1,250.00&lt;/code&gt; and &lt;code&gt;S$12.50&lt;/code&gt; do not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A name longer than 25 characters.&lt;/strong&gt; Shorten it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fields in the wrong order.&lt;/strong&gt; Keep the IDs in ascending order, with &lt;code&gt;63&lt;/code&gt; last.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before you trust any generator, including your own, scan a few results with real bank apps and check the name and amount on the screen. Do not pay to test; stop at the confirm screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you would rather not maintain this yourself
&lt;/h2&gt;

&lt;p&gt;Getting the format right is the easy part. Keeping it right as you add amounts, expiry dates and references, and testing every change against real bank apps, is the part that takes time.&lt;/p&gt;

&lt;p&gt;KachingQR has a free API. One request returns JSON with the payload text and the QR code image as base64 (PNG by default, or SVG):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://kachingqr.com/api/v1/qr &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"proxy_type":"uen","proxy_value":"201912345K","amount":"4.50","amount_editable":false,"reference":"INV-1001","merchant_name":"SUNNY DAY KOPI"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See the &lt;a href="https://kachingqr.com/docs/api" rel="noopener noreferrer"&gt;API docs&lt;/a&gt; for every field, limit and error code, or make a code by hand with the &lt;a href="https://kachingqr.com/paynow-qr-generator" rel="noopener noreferrer"&gt;PayNow QR code generator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;KachingQR is an independent tool. It is not part of PayNow or any bank, and it never receives or holds money: payments go straight from the payer's bank to yours.&lt;/p&gt;

</description>
      <category>php</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>payments</category>
    </item>
  </channel>
</rss>
