配達領収書を適切に処理する方法

7770 ワード

パーカーDeWildeによって
私たちの顧客のすべてが適切に配達領収書を扱っていなかったことを知るためにショックを受けました、しかし、私が私たちの公的に利用可能なドキュメンテーションを覗き見たとき、私はそれが若干の重要なステップを逃していたと理解しました.この記事はうまくいけばどんな穴にでもパッチをして、顧客に正しい方法でDRSを取り扱うのを許します.
配達領収書は、携帯電話に送信されたメッセージに何が起こったかについてのフィードバックを得るための主要な方法です.v 4 HTTP APIを使用すると、メッセージが配信される(または失敗)ときにコールバックを受信するURLを指定できます.
あなたが配達領収書を受け取るためにする必要がある最初のことは、JSON本体でHTTP POSTリクエストを受け取ることができるDRコールバックを受け取るために指定するURLでエンドポイントを持つサーバーを持つことです.
このブログの目的のために、私は、それが許す簡潔さのためにフラスコでPythonを使用している例をつくります.他のプラットホームも同様の効果がある.私とPEP 8は、私のフォーマットで耐えます.
from flask import Flask, request
app = Flask(__name__)
# we will accept POSTs on the root context
@app.route('/', methods=['POST'])
def receiveDr():
 # JSON body will be automatically deserialized into Python data structures
 drJson = request.json
 return “OK”
# For dev purposes, we will use the built-in Flask web server. Production use cases should use a proper server such as gunicorn + nginx proxy
app.run(host='0.0.0.0', port=8080)
ほとんどのお客様は、このポイントを正しく入手可能なドキュメントを使用して取得することができますが、次の部分は、彼らが通常混乱している場所です.Dr . Jsonがあれば、何かする必要があります.明らかに、顧客はメッセージをマークするためにデータベースを更新することのような愚かなことをしていました、あるいは、失敗してください、そして、数がもはや配達可能でないならば電子メールを誘発して、または何らかのデータ視覚化を供給して.
これらはすべて間違っている.配達領収書を扱う正しい方法を見つけるために、あなたは名前を見る必要があります.それは領収書です.それを処理するには、サーマルプリンタが必要です.KTRA(領収書を守る)のおかげで、あなたはFMA(連邦メッセージングエージェンシー)による監査の場合、7年間の物理的な形ですべての配信領収書を保持する必要があります.
第1段階はレシートプリンターを取得することです.私はエプソンTM - T 88 VモデルM 444 Aをお勧めします.これは広く使用され、USB接続を持っており、100ドル未満のeBayで見つけることができます.
私は1040 msで単一の領収書を印刷するために時間を計ったので、あなたが必要とするプリンターの数を見つけるために、TPS/0.962を分割してください.私は平均TPSを見て、少し余分を加えて、ピーク時に印刷される領収書をキューに入れることを勧めます.例えば、1つの1000のメッセージを送る顧客は、彼らの荷を満たすためにおよそ1040のプリンターを必要とするでしょう.そして、おそらく、彼らが実行するとき、冗長性を考慮に入れる追加100とレシート紙の追加を許します.各々の領収書は13.2 cmです、そして、1枚のロールは230フィートまたは7010 cmです.領収書ごとに1.040秒を与えられると、9分と12秒ごとに紙を交換する従業員が必要になります.そうするために15秒かかると仮定して、あなたはあなたが持っているすべての36のプリンターのためにもう一つの従業員を必要とします.1000のTPSのために、それは30の紙詰まりのスタッフを意味します.
レシートプリンターを持っているならば、あなたはそれをあなたのコンピュータに接続する必要があります.Linuxはデフォルトではデバイスへのアクセス許可を与えません.そうすることはあまり複雑ではありません.
$ lsusb
...
Bus 001 Device 009: ID 04b8:0202 Seiko Epson Corp. Interface Card UB-U05 for Thermal Receipt Printers [M129C/TM-T70/TM-T88IV]
...
$
lsusbコマンドはプリンタを表示します.ベンダーIDと製品IDに興味があります.私の場合、ベンダーIDは04 b 8で、製品IDは0202です.
一旦それらを持っているならば、我々は我々のユーザーを加えるグループを作成する必要があります、そして、Udev規則はそのグループへのアクセスを装置に与えるために.lsusbを使用していたプリンタの製品IDとベンダーIDを入れる必要があることに注意してください.
$ sudo groupadd usbusers
$ sudo addgroup <YOUR_USERNAME_HERE> usbusers
$ sudo sh -c  'echo "SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"04b8\", ATTRS{idProduct}==\"0202\", MODE=\"0664\", GROUP=\"usbusers\"" > /etc/udev/rules.d/99-escpos.rules'
Udevルールを再ロードする必要があります.最も簡単な方法はコンピュータをリブートすることです.
それは難しい部分です!今すぐリトルパイソン.最初にPython ESPOSライブラリをインストールします.これは、Pythonからサーマルプリンタにコマンドを発行する方法です.
from escpos.printer import *
# Substitute your vendor id and product id here!
p = Usb(0x04b8, 0x0202) # connect to printer, will fail if permissions not right
p.set() # reset the text properties
p.text("hello world\n")
p.cut() # cut the receipt with the automated knife if your printer supports it
あなたは今領収書を持っている必要があります!しかし、それはかなりの配達領収書です!ほとんどそこ!
以下はコード全体です.
from escpos.printer import * # use for connecting to thermal printer
from PIL import Image # use for opening and scaling images for logo
from flask import Flask, request # use for exposing API
# this scales any image to fit on your printer. 512 width works well for mine, you may need to choose a different value
def getImage(fileName):
 MAX_WIDTH = 512
 img = Image.open(fileName)
 wpercent = (MAX_WIDTH / float(img.size[0]))
 hsize = int((float(img.size[1]) * float(wpercent)))
 img = img.resize((MAX_WIDTH, hsize), Image.ANTIALIAS)
 return img
#printer setup
p = Usb(0x04b8, 0x0202)
p.set()
app = Flask(__name__)
@app.route('/', methods=['POST'])
def receiveDr():
 drJson = request.json # get json from post request
 # most fields are stored inside of a wrapper object, unwrap for convenience
 mtStatus = drJson['deliveryReceipt']['mtStatus']
 # print a logo at the top of the receipt
 # you will need the image in the same directory as the python script
 p.image(getImage('logo.png'))
 # tells printer to center align text we put in
 p.set(align='center')
 # tells the printer to print text
 p.text("\nDELIVERY RECEIPT\n\n")
 # helper function to handle formatting for us
 def printItem(first, second):
  p.set(align='left', bold=True)
  p.text(first)
  p.set(bold=False)
  p.text(str(second) + "\n")
 # print the parts of the DR, we will break into sections with a couple of dividers
 printItem("TICKET ID: ", mtStatus['ticketId'])
 printItem("DLVR DATE: ", mtStatus['deliveryDate'])
 printItem("DLR  CODE: ", mtStatus['code'])
 printItem("DLR  DESC: ", mtStatus['description'])
 printItem("NOTE    1: ", mtStatus['note1'])
 p.set(align='center')
 p.text("\n===DESTINATION===\n\n")
 printItem("DEST ADDR: ", mtStatus['destination']['address'])
 printItem("DST CNTRY: ", mtStatus['destination']['alpha2Code'])
 printItem("DST OP ID: ", mtStatus['destination']['mobileOperatorId'])
 p.set(align='center')
 p.text("\n===SOURCE===\n\n")
 printItem("SRC ADDR: ", mtStatus['source']['address'])
 printItem("SRC  TON: ", mtStatus['source']['ton'])
 # CODE128 barcodes need to be prefixed with ‘{B’, it seems to be a quirk of the library
 p.barcode('{BAPRILFOOLS', 'CODE128', function_type="B", pos='OFF')
 # cut the receipt
 p.cut()
 # return OK to OM -- 200 is implied unless we change the response code
 return "OK"
# development server for testing
if __name__ == "__main__":
 app.run(host='0.0.0.0', port=8080)
すべてのそれを残してOpenMarketのSMS APIを呼び出すことです!私は、顧客のメッセージング顧客として、ソースアドレスではなく、キャンペーンIDを呼び出していることに注意してください.これは私のテストアカウントがどのように設定されているためです.ほとんどの顧客はAPIを呼び出すときにソースアドレスを指定します.
curl -L -X POST 'https://smsc.openmarket.com/sms/v4/mt' \
-H 'Authorization: Basic YXByaWw6Zm9vbHM6KQ==' \
-H 'Content-Type: application/json' \
--data-raw '{
    "mobileTerminate": {
        "options": {
            "campaignId": "MYTESTCAMPAIGN",
            "note1": "I'\''m making a note here: HUGE SUCCESS"
        },
        "destination": {
            "address": "13605556564"
        },
        "message": {
            "content": "Hello World!",
            "type": "text",
            "validityPeriod": 3599
        },
        "delivery": {
            "receiptRequested": "final",
            "url": "http://my-totally-real-url.tld:9088/"
        }
    }
}'
IT作業の一例私は、APIリクエストを作るために郵便配達人を使っています.私の電話番号は難読化しましたが、それは作業例です.

幸せな印刷とエイプリルフール!
信用
https://ramonh.dev/2020/09/22/usb-device-linux-startup/
https://vince.patronweb.com/2019/01/11/Linux-Zjiang-POS58-thermal-printer/