首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用树莓派的摄像模块实现“扫码枪”

利用树莓派的摄像模块实现“扫码枪”

作者头像
yumusb
发布2020-08-28 15:15:03
1.8K0
发布2020-08-28 15:15:03
举报
文章被收录于专栏:坏男孩坏男孩

演示如下:

扫码
扫码

最近弄了一个树莓派,便想试试有没有什么好玩的项目,于是利用手头技能做了一个这个。

前提条件

  • 支付: 支付宝下的当面付产品,个人可签约。提供用户扫码支付和商家扫用户付款码两种方式。此处我们选择商家扫用户付款码的方式。 https://opendocs.alipay.com/open/54/104506
  • 扫码 树莓派可连接摄像模块,来进行“扫码”操作。
  • 程序实现 结合SDK类型与扫码操作,选择使用python3实现。

整体流程

  • 支付 上面支付宝提供了当面付的demo,但是只有Java和php版本,但是提供了整的SDK的python版本(https://github.com/alipay/alipay-sdk-python-all),所以我们需要按照当面付的demo来用Python实现。
  • 扫码 直接使用摄像头模块拍照后识别收款码中的条码或者二维码即可拿到当前用户的信息。 将扫码获得的用户信息传入上面的支付流程中即可完成支付。

具体实现流程

github地址:https://github.com/yumusb/scan2pay,配合代码阅读本文更佳。

  • 扫码部分 picamera(树莓派摄像头模块),PIL(图片文件流读取) ,pyzbar(解码,二维码、条形码) def scan():
  1. stream = BytesIO()
  2. camera = PiCamera()
  3. camera.start_preview()
  4. sleep(2)
  5. #camera.capture('new.jpg') 保存图片,利于查看效果
  6. camera.capture(stream, format='jpeg')
  7. # "Rewind" the stream to the beginning so we can read its content
  8. stream.seek(0)
  9. image = Image.open(stream)
  10. camera.close() # 此处一定要关闭,不然下次调用时候会提示占用
  11. try:
  12. decodedata=decode(image)
  13. if(len(decodedata)==0):
  14. return ""
  15. #未解码出数据,结果集长度为0
  16. userinfo=decodedata[0].data
  17. if(len(userinfo)==18):
  18. return userinfo
  19. else:
  20. print(f"{userinfo}不是正确的收款码")
  21. # userinfo 是18位数字,且以28开头。
  22. return ""
  23. except Exception as e:
  24. print(traceback.format_exc())
  25. return ""
  • 支付部分
    1. 新建config对象,设置私钥、公钥、appid。
    2. 新建交易对象,设置交易用户、金额、标题、商户订单号、交易类型
    3. 发起支付
    4. def pay(userinfo):
  1. """
  2. 设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。
  3. """
  4. alipay_client_config = AlipayClientConfig()
  5. alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do'
  6. alipay_client_config.app_id = '' # appid
  7. alipay_client_config.app_private_key = '' # 用户私钥
  8. alipay_client_config.alipay_public_key = '' # 支付宝公钥(填入用户私钥,返回的支付宝公钥,而不是上面用户私钥对应的公钥,如果不会配置的话可以看我另一项目中的文档 https://github.com/yumusb/alipay-f2fpay/tree/master/%E5%AF%86%E9%92%A5%E5%AF%B9%E7%94%9F%E6%88%90%E4%B8%8E%E8%AE%BE%E7%BD%AE%E6%95%99%E7%A8%8B)
  9. """
  10. 得到客户端对象。
  11. 注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后,alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。
  12. logger参数用于打印日志,不传则不打印,建议传递。
  13. """
  14. #client = DefaultAlipayClient(alipay_client_config=alipay_client_config, logger=logger)
  15. client = DefaultAlipayClient(alipay_client_config=alipay_client_config)
  16. """
  17. 系统接口示例:alipay.trade.pay
  18. """
  19. # 对照接口文档,构造请求对象
  20. model = AlipayTradePayModel()
  21. model.auth_code = userinfo
  22. model.subject = "Test" # 订单标题
  23. model.out_trade_no = time() # 订单账号
  24. model.scene = "bar_code"
  25. model.total_amount = 0.01 # 订单金额
  26. request = AlipayTradePayRequest(biz_model=model)
  27. response_content = None
  28. try:
  29. response_content = client.execute(request)
  30. except Exception as e:
  31. print(traceback.format_exc())
  32. if not response_content:
  33. print("failed execute")
  34. else:
  35. response = AlipayTradePayResponse()
  36. # 解析响应结果
  37. response.parse_response_content(response_content)
  38. #print(response.body)
  39. #返回结果集,如果不能成功支付的话,建议输出以排错
  40. if response.is_success():
  41. # 如果业务成功,则通过respnse属性获取需要的值
  42. print("get response trade_no:" + response.trade_no)
  43. else:
  44. # 如果业务失败,则从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
  45. print(response.code + "," + response.msg + "," + response.sub_code + "," + response.sub_msg)

更多内容请看github。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提条件
  • 整体流程
  • 具体实现流程
相关产品与服务
云支付
云支付(Cloud Pay,CPay)为您提供开放、可靠的聚合收款技术服务和商户管理功能。云支付支持刷卡支付、扫码支付、一码多付多种支付方式。服务商也可使用云支付提供的 SDK 和 HTTPS 接口,将云支付集成进自己的系统中,为商户提供的个性化解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档