{ "info": { "author": "Tinchy", "author_email": "tinchy@yeah.net", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 2.1", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "![django_miniprogram_api](./LOGO/django_miniprogram_api.png)\n\nDjango MiniProgram API - Django \u5fae\u4fe1\u5c0f\u7a0b\u5e8f API\n============================================\n\nDjango \u5fae\u4fe1\u5c0f\u7a0b\u5e8f API \u662f\u4f9d\u8d56\u4e8e django-rest-framework \u5236\u4f5c\u7684restful api\uff0c\u5c01\u88c5\u4e86\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7684\u767b\u9646\uff0c\u7528\u6237\u8d44\u6599\u66f4\u65b0\uff0c\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u652f\u4ed8\u7b49\u4e00\u7cfb\u5217\u64cd\u4f5c\u3002\u4e3a\u5f00\u53d1\u8005\u63d0\u4f9b\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u540e\u53f0\u7684\u7b80\u4fbf\u64cd\u4f5c\u3002\n\n\uff08\u5b8c\u5584\u4e2d\uff0c\u767b\u9646\u4ee5\u53ca\u7528\u6237\u4fe1\u606f\u66f4\u65b0\u5df2\u7ecf\u53ef\u4ee5\u4f7f\u7528\uff09\n\n## \u5b89\u88c5\n\n```bash\npip install django_miniprogram_api\n```\n\n## \u5b89\u88c5\u4f9d\u8d56\n\n```python\npycrypto==2.6.1\ndjangorestframework==3.10.3\nxmltodict==0.12.0\ndjangorestframework-xml==1.4.0\nDjango==2.x.x\nrequests==2.22.0\n\n```\n\n\u5feb\u901f\u5165\u95e8\n-------\n\n1. \u6dfb\u52a0 \"miniprogram_api\" \u548c django-rest-framework \u76f8\u5173\u7684 modules \u4ee5\u53ca \u914d\u7f6e \u5230 INSTALLED_APPS\uff0c\u5e76\u4e14\u6dfb\u52a0 WECHAT_MINIPROGRAM_CONFIG \u914d\u7f6e\u6587\u4ef6::\n \n ```python\n INSTALLED_APPS = [\n 'miniprogram_api',\n 'rest_framework.authtoken',\n 'rest_framework'\n ]\n WECHAT_MINIPROGRAM_CONFIG = {\n \"APPID\": \"\",\n \"SECRET\": \"\",\n \"WECHAT_PAY\": {\n \"MCH_ID\": \"\", # \u5fae\u4fe1\u652f\u4ed8\u5546\u6237\u53f7\n \"KEY\": \"\", # API\u5bc6\u94a5\n \"NOTIFICATION_URL\": '', # \u5fae\u4fe1\u652f\u4ed8\u56de\u8c03\u5730\u5740\n }\n }\n REST_FRAMEWORK = {\n \t'DEFAULT_PERMISSION_CLASSES': [\n ...\n 'rest_framework.authentication.BasicAuthentication', # add this\n 'rest_framework.authentication.TokenAuthentication', # add this\n ],\n \t'DEFAULT_PARSER_CLASSES': (\n 'rest_framework_xml.parsers.XMLParser', \n ),\n }\n ```\n \n \n \n2. \u914d\u7f6e\u5c0f\u7a0b\u5e8f\u767b\u9646 url /miniprogram_auth/ \u5230\u4f60\u9879\u76ee\u7684 urls.py::\n\n ```python\n url(r'^miniprogram_auth/', include('miniprogram_api.urls')),\n ```\n\n \n\n3. \u8fd0\u884c `python manage.py migrate` \u6765\u521b\u5efa WeChatAccount \u6a21\u578b.\n\n4. \u8fd0\u884c\u6d4b\u8bd5\u670d\u52a1\u5668 `python manage.py runserver 127.0.0.1:8000` \u5c31\u53ef\u4ee5\u5f00\u59cb\u4f7f\u7528\u4e86\n\n\u4f7f\u7528\n---\n\n### \u5c0f\u7a0b\u5e8f\u767b\u9646\n\n**\u8bf7\u6c42**\n\n`http://127.0.0.1/miniprogram_auth/login` \n\nmethod: post, \n\nbody: \n\n```json\n{\n\t\"code\": \"061YsgK50ru0wC1uCHH50D2mK50YsgKa\"\n}\n```\n\n\u767b\u9646\u6a21\u5757\u5305\u62ec\u4e86\u5fae\u4fe1 [auth.code2Session](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html) \u63a5\u53e3\uff0c\u5f00\u53d1\u8005\u901a\u8fc7\u8c03\u7528 [wx.login()](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html) \u83b7\u53d6\u4e34\u65f6\u767b\u5f55\u51ed\u8bc1code\uff0c\u53d1\u9001\u7ed9 \u6211\u4eec\u7684 Login api\uff0c\u83b7\u53d6 django \u7684\u7528\u6237\u767b\u5f55\u72b6\u6001 Token\u3002\n\n**\u8fd4\u56de**\n\n```json\n{\n\t\"token\": \"fa7cd4cdb5554a9b69b876d6c6bf775ac6be250d\", // \u8fd4\u56de\u7684token \u9700\u8981\u5305\u542b\u5728 request header\n\t\"user_id\": 1\n}\n```\n\n#### \u4f7f\u7528 Token \u4fdd\u6301\u4f1a\u8bdd\n\n\u5728\u4f60\u7684\u8bf7\u6c42\u5934\u5305\u542btoken\u4fe1\u606f\uff0c\u8981\u6ce8\u610f\u7684\u662f\u5982\u679c\u4f60\u6ca1\u6709\u81ea\u5b9a\u4e49\u7684\u767b\u5f55\u72b6\u6001\uff0c\u4f8b\u5982\uff1a\u7528\u6237\u624b\u673a\u53f7\u90ae\u7bb1\u6ce8\u518c\u767b\u5f55\uff0c\u90a3\u4e48\u8bf7\u5728\u4e4b\u540e\u7684api\u4e2d\u90fd\u4f7f\u7528\u540c\u6837\u7684token\u8bf7\u6c42\u5934\u3002\n\n```json\nAuthorization: Token fa7cd4cdb5554a9b69b876d6c6bf775ac6be250d\n```\n\n### \u7528\u6237\u4fe1\u606f\u66f4\u65b0\n\n**\u8bf7\u6c42**\n\n`http://127.0.0.1/miniprogram_auth/updateUserInfo` \n\nmethod: post, \n\nbody: \n\n```json\n{\n\t\"iv\":\"QRWwdpUUx9zaN4fXGM4Asw==\",\n\t\"encryptedData\": \"F7VcR8vKZqzaEqS18f7qJ3VuYLl5AjExEHldqC3og3XOKlZPg+U9ki/onlrjrG9OLZDyJrno/nEegXH9V/1sMzGFpCCqhR9MHVTaq9fyANOVazniVmkzwysD0dwwk9bj4Uulz3KuqtTwoI2VFXEAmuj0kzCG1atqCo5RXZnZ30M8O3mbnSPAvDb6pEBBgT6YoQGuIskYQ82kIO3Z/ZtX8XCcmYAjagUkie1CGZUcYd5VxtSL6iGd+HVwxC1rspvda1OcgIdRlU/tIA3Euhbd4qKuqlmR6LJVdZNs9gg/CMY1ZGcRQnz8cbQWUqFOEaZQHU/oiXeDmo5V/HeQXzv9c+lgZ+SMk81VNLC8/T4SF5ivaoULHV/Th+jqYKDjJGwDAbM4tK+4Gkb45QFny3ZDh/09Fk9TwtfR2nkH/Wxpyyhkp0DPbhvd8oq8wH13I0XbsO0WuM0D8YpZF+H74CiiPDiKRzPEpLKU2nCWdlpHDZ0=\"\n}\n```\n\n\u5f00\u53d1\u8005\u901a\u8fc7\u8c03\u7528\u63a5\u53e3\uff08\u5982 [wx.getUserInfo](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html)\uff09\u83b7\u53d6\u6570\u636e\u65f6\uff0c\u63a5\u53e3\u4f1a\u540c\u65f6\u8fd4\u56de encryptedData\uff0c iv \u6570\u636e\uff0c\u5c06\u6b64\u6570\u636e\u53d1\u9001\u7ed9updateUserInfo api\uff0cAPI \u5c06\u4f1a\u89e3\u5bc6\u6570\u636e\uff0c\u4ee5\u83b7\u53d6\u7528\u6237\u4fe1\u606f\u5e76\u8fd4\u56de\u3002\uff08\u6b64\u64cd\u4f5c\u4e00\u822c\u5728\u5c0f\u7a0b\u5e8f\u6388\u6743\u7528\u6237\u4fe1\u606f\u65f6\u4f7f\u7528\uff0c\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7684\u65b0\u767b\u5f55\u89c4\u5219\uff0c\u767b\u9646\u5b9e\u9645\u4e0a\u662f\u9650\u5236\u7684 [wx.getUserInfo](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html) \u63a5\u53e3\uff09\n\n**\u8fd4\u56de**\n\n```json\n{\n \"token\": \"fa7cd4cdb5554a9b69b876d6c6bf775ac6be250d\",\n \"wechat\": {\n \"id\": 1,\n \"nickName\": \"TINCHY\",\n \"avatarUrl\": \"https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLp9mKpmqTUic0TmCMo6Cbibmsvmo6Vt3NGdP0cZOYRwoGPe13LsvHEicoZGvjq6syaeG0GGWJOrqCbA/132\",\n \"gender\": \"1\",\n \"city\": \"Shanghai\",\n \"province\": null,\n \"country\": null,\n \"user\": 1\n }\n\n}\n```\n\n### \u5fae\u4fe1\u652f\u4ed8 class wechat_pay.WeChatPay()\n\n\u5fae\u4fe1\u652f\u4ed8\u7684api\u56e0\u4e3a\u6bcf\u4e00\u4e2a\u64cd\u4f5c\u90fd\u8981\u6c42\u4e0d\u540c\uff0c\u4e0d\u540c\u7528\u6237\u4e0d\u540c\u573a\u666f\u90fd\u6709\u9700\u6c42\uff0c\u56e0\u6b64\u6ca1\u6709\u5c01\u88c5HTTP API\uff0c\u4f46\u662f\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7b80\u5355\u5c01\u88c5\u7684object\uff0c\u4ee5\u53ca\u63d0\u4f9b\u4e86\u4e00\u4e2a\u8ba2\u5355\u72b6\u6001 Model\uff1aPayOrder\n\n\u60f3\u8981\u83b7\u53d6\u8ba2\u5355\u72b6\u6001\uff0c\u8bf7\u5c06\u81ea\u5df1\u7684\u5546\u54c1 OneToOne \u5230 PayOrder, \u4f8b\u5982\uff1a\n\n```python\nclass PickUpOrder(models.Model):\n\t\twechat_order = models.OneToOneField(PayOrder)\n\t\t...\n\n@receiver(post_save, sender=PickUpOrder)\ndef create_order(sender, instance, created, **kwargs):\n if created:\n PayOrder.objects.create(pickuporder=instance, outTradeNo='')\t\t\n```\n\n**\u63a5\u53e3\u8fd4\u56de\u7b49\u6570\u636e\u8bf7\u67e5\u8be2\u5fae\u4fe1\u652f\u4ed8\u5b98\u65b9\u6587\u6863** https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1\n\n#### \u7edf\u4e00\u4e0b\u5355\n\n```python\nWeChatPay().unified_order(\n spbill_create_ip='''\u5c0f\u7a0b\u5e8f\u7528\u6237\u7684IP\u5730\u5740''',\n open_id='''\u5c0f\u7a0b\u5e8f\u7528\u6237\u7684open id''', \n body='''\u5546\u54c1\u63cf\u8ff0''', \n order_id='''\u8ba2\u5355id\uff0c\u5fc5\u987b\u552f\u4e00\uff0c\u5efa\u8bae\u4f7f\u7528\u65e5\u671f\u65f6\u95f4\u6233''',\n total_fee='''\u8ba2\u5355\u91d1\u989d\uff0c\u5355\u4f4d\u4e3a\u5206\uff01\uff01\uff01\uff01'''\n)\n```\n\n**\u7b80\u5355\u4f8b\u5b50\uff1a**\n\n\u5fae\u4fe1\u7edf\u4e00\u4e0b\u5355\u63a5\u53e3\uff1ahttps://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1\n\n```python\n\nfrom .model import PickupOrder # \u8fd9\u4e2amodel\u662f\u6211\u7684\u6d4b\u8bd5model\uff0c\u7528\u4e8e\u8ba2\u5355\u67e5\u8be2\nfrom django.conf import settings # \u5bfc\u5165 settings\nfrom .wechat_pay import WeChatPay, WeChatSignHelper # \u5bfc\u5165 \u5fae\u4fe1\u652f\u4ed8 api \u4ee5\u53ca \u7b7e\u540d\u9a8c\u8bc1\nfrom miniprogram_api.model import WeChatAccount\nfrom rest_framework import views, status\n\nclass WeChatPayAPIView(views.APIView):\n permission_classes = [IsAuthenticated]\n def post(self, request):\n from django.utils.datetime_safe import datetime\n data = request.data\n _id = data['id']\n if not PickupOrder.objects.filter(id=data['id']).exists():\n raise ValidationError('This order does not exists')\n item = PickupOrder.objects.get(id=data['id'])\n if not item.payorder.paid: # \u5982\u679c\u672a\u4ed8\u6b3e\n \toutTradeNo = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3] # \u751f\u6210 order_id \u7528\u65f6\u95f4\u7cbe\u786e\u5230\u5206\u79d2\u4ee5\u4fdd\u8bc1\u8ba2\u5355\u53f7\u7684\u552f\u4e00\u6027\n item.order_id = outTradeNo\n item.payorder.outTradeNo = outTradeNo # \u5c06\u8ba2\u5355\u53f7\u4fdd\u5b58\u5230 \u6570\u636e\u5e93\n item.save()\n wechat_user = WeChatAccount.objects.get(user=self.request.user)\n wp = WeChatPay()\n address = self.request.META.get('HTTP_X_FORWARDED_FOR') # \u83b7\u53d6\u5c0f\u7a0b\u5e8f\u8bbf\u95ee\u7528\u6237\u7684 ip \u5730\u5740\n if address:\n ip = address.split(',')[0]\n else:\n ip = address.META.get('REMOTE_ADDR') \n res = wp.unified_order(spbill_create_ip=ip,open_id=wechat_user.union_id, body=item.car_type.desc, total_fee=item.fee, order_id=item.order_id)\n if res['return_code'] == 'SUCCESS' and res['result_code'] == 'SUCCESS':\n pay_sign = {\n 'appId': settings.WECHAT_MINIPROGRAM_CONFIG['APPID'],\n 'nonceStr': wp.ranstr(16),\n 'package': 'prepay_id='+res['prepay_id'],\n 'signType': 'MD5',\n 'timeStamp': str(time.time())\n }\n sign = WeChatSignHelper(pay_sign, settings.WECHAT_MINIPROGRAM_CONFIG['WECHAT_PAY']['KEY']).getSign()\n pay_sign['paySign'] = sign # \u7b7e\u540d\u9a8c\u8bc1\u652f\u4ed8\u8ba2\u5355\u7684\u6b63\u786e\u6027\n return Response({'pay_sign': pay_sign}) # \u8fd4\u56de\u7ed9\u5c0f\u7a0b\u5e8f\u53d1\u8d77\u5c0f\u7a0b\u5e8f\u7684\u652f\u4ed8\u63a5\u53e3 \n else:\n return Response(\"Make order failed\", status=status.HTTP_406_NOT_ACCEPTABLE)\n```\n\n\u4e0b\u5355\u4e4b\u540e\uff0c\u7cfb\u7edf\u4f1a\u6839\u636e\u60a8\u5728settings.py\u4e2d\u8bbe\u7f6e\u7684 NOTIFICATION_URL \u8fdb\u884c\u56de\u8c03\uff0c\u6765\u66f4\u65b0\u7528\u6237\u7684\u8ba2\u5355\u72b6\u6001\u3002\u52a1\u5fc5\u8bbe\u7f6e\u6b63\u786e\u3002\uff08\u672c\u5730\u73af\u5883\u8fd0\u884c\u7684\u670d\u52a1\u5668\uff0c\u5fae\u4fe1\u65e0\u6cd5\u8fdb\u884c\u56de\u8c03\uff0c\u52a1\u5fc5\u5728\u751f\u4ea7\u6216\u8005\u6d4b\u8bd5\u670d\u52a1\u5668\u4e0a\u8fd0\u884c\uff09\n\n```python\nWECHAT_MINIPROGRAM_CONFIG = {\n \"WECHAT_PAY\": {\n \"NOTIFICATION_URL\": 'http://www.example.com/miniprogram_auth/wechatPayCallback', # \u586b\u5199\u4f60\u7684\u670d\u52a1\u5668\u5730\u5740\u52a0\u56de\u8c03\u57df\u540d\n }\n}\n```\n\n#### \u67e5\u8be2\u8ba2\u5355\n\n\u5fae\u4fe1\u67e5\u8be2\u8ba2\u5355\u63a5\u53e3\uff1ahttps://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2\n\n```python\nWeChatPay().order_query(\n transaction_id='''\u5fae\u4fe1\u7684\u8ba2\u5355\u53f7\uff0c\u5efa\u8bae\u4f18\u5148\u4f7f\u7528''',\n out_trade_no='''\u5546\u6237\u7cfb\u7edf\u5185\u90e8\u8ba2\u5355\u53f7\uff0c\u8981\u6c4232\u4e2a\u5b57\u7b26\u5185, \u8fd9\u91cc\u6307\u7684\u662f order_id, \u5373\u8ba2\u5355\u53f7'''\n)\n# transaction_id \u548c out_trade_no \u53ea\u9700\u8981\u9009\u4e00\u4e2a\uff0c\u4e0d\u8981\u5168\u90e8\u586b\u5199\n```\n\n#### \u5173\u95ed\u8ba2\u5355\n\n\u5fae\u4fe1\u5173\u95ed\u8ba2\u5355\u63a5\u53e3\uff1ahttps://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3\n\n```python\nWeChatPay().close_order(\n out_trade_no='''\u5546\u6237\u7cfb\u7edf\u5185\u90e8\u8ba2\u5355\u53f7\uff0c\u8981\u6c4232\u4e2a\u5b57\u7b26\u5185, \u8fd9\u91cc\u6307\u7684\u662f order_id, \u5373\u8ba2\u5355\u53f7'''\n)\n```\n\n## \u4ee5\u4e0b\u63a5\u53e3\u6b63\u5728\u5f00\u53d1...\n\n#### [\u7533\u8bf7\u9000\u6b3e](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4)\n\n#### [\u67e5\u8be2\u9000\u6b3e](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5)\n\n#### [\u4e0b\u8f7d\u5bf9\u8d26\u5355](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_6)\n\n#### [\u4e0b\u8f7d\u8d44\u91d1\u8d26\u5355](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_18&index=7)\n\n#### [\u652f\u4ed8\u7ed3\u679c\u901a\u77e5](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8)\n\n#### [\u4ea4\u6613\u4fdd\u969c](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_8&index=9)\n\n#### [\u9000\u6b3e\u7ed3\u679c\u901a\u77e5](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10)\n\n#### [\u62c9\u53d6\u8ba2\u5355\u8bc4\u4ef7\u6570\u636e](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_17&index=11)\n\n## LICENSE\n\nBSD 3-Clause License\n\n## \u5f00\u53d1\u8005\n\nTinchy\uff1atinchy@yeah.net\n\n## \u8d5e\u52a9\n\n![zanshang](./LOGO/zanshang.png)", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/TinchyChing/django_miniprogram_api", "keywords": "", "license": "BSD License", "maintainer": "", "maintainer_email": "", "name": "django-miniprogram-api", "package_url": "https://pypi.org/project/django-miniprogram-api/", "platform": "", "project_url": "https://pypi.org/project/django-miniprogram-api/", "project_urls": { "Homepage": "https://github.com/TinchyChing/django_miniprogram_api" }, "release_url": "https://pypi.org/project/django-miniprogram-api/1.0.3/", "requires_dist": null, "requires_python": "", "summary": "A simple Django app implemented the WeChat miniprogram's login, payment and other APIs", "version": "1.0.3" }, "last_serial": 5879772, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "8eb20d78e266536fa581ac95775d2661", "sha256": "3bd58b4a831af0c8d5e3a034fa18c6446d78c71ba4fbe909b5dcc001faff3854" }, "downloads": -1, "filename": "django_miniprogram_api-0.0.1.tar.gz", "has_sig": false, "md5_digest": "8eb20d78e266536fa581ac95775d2661", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5642, "upload_time": "2019-09-24T00:45:15", "url": "https://files.pythonhosted.org/packages/2f/05/7e76b910087566cbe7531c4ba1cda8a5cbcdf6e265ae6fc64502f7678064/django_miniprogram_api-0.0.1.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "b0d0ccd03bbde7796b9fe13aca2ee62a", "sha256": "efc4174fa4984d36f25c2fa4cff19881a628c3631fbee16f85688de0766f8892" }, "downloads": -1, "filename": "django_miniprogram_api-1.0.1.tar.gz", "has_sig": false, "md5_digest": "b0d0ccd03bbde7796b9fe13aca2ee62a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12200, "upload_time": "2019-09-24T00:47:11", "url": "https://files.pythonhosted.org/packages/4f/c0/6e216f39e88263fa255d32480e6c1f78a8899f9c6976745253e049b578a3/django_miniprogram_api-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "0e2fe964439b2ad8d612c97a672f8c8c", "sha256": "b8fa53e5f161a37e4c9f3e6326aed4e221342b15ec3936bf73e8b61fc7915c6e" }, "downloads": -1, "filename": "django_miniprogram_api-1.0.2.tar.gz", "has_sig": false, "md5_digest": "0e2fe964439b2ad8d612c97a672f8c8c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 373969, "upload_time": "2019-09-24T00:50:25", "url": "https://files.pythonhosted.org/packages/28/9a/bc1c29edc3170e2259632cfbb20a9d288113911d69740824cbebf6f213ee/django_miniprogram_api-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "348b44e028fc8fc6a5090f46e365671b", "sha256": "8b04ab5f22d07625cb864cf50572096c4521a82f94b31dcd1df1463bd8ec8724" }, "downloads": -1, "filename": "django_miniprogram_api-1.0.3.tar.gz", "has_sig": false, "md5_digest": "348b44e028fc8fc6a5090f46e365671b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 374060, "upload_time": "2019-09-24T13:36:22", "url": "https://files.pythonhosted.org/packages/33/64/0cc5995dceca2579a3074c5dbacc1e9e3ce078b22fc1ca2165435459d9be/django_miniprogram_api-1.0.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "348b44e028fc8fc6a5090f46e365671b", "sha256": "8b04ab5f22d07625cb864cf50572096c4521a82f94b31dcd1df1463bd8ec8724" }, "downloads": -1, "filename": "django_miniprogram_api-1.0.3.tar.gz", "has_sig": false, "md5_digest": "348b44e028fc8fc6a5090f46e365671b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 374060, "upload_time": "2019-09-24T13:36:22", "url": "https://files.pythonhosted.org/packages/33/64/0cc5995dceca2579a3074c5dbacc1e9e3ce078b22fc1ca2165435459d9be/django_miniprogram_api-1.0.3.tar.gz" } ] }