zoukankan      html  css  js  c++  java
  • day-93微信小程序

    授权

    前台代码

     

    数据后台解密与存储数据库(utf8mb4模式)

     settings:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'wxpy8',
            'USER':'root',
            'PASSWORD':"123",
            'HOST':'127.0.0.1',
            'PORT':3306,
            'OPTIONS': {'charset': 'utf8mb4'},          #必须要写
    
        }
    }

    views:

    class Userinfo(APIView):
        def post(self,request):
            param=request.data
            if param.get('encrytedData') and param.get('iv') and param.get('token'):
                user_data=cache.get(param.get("token"))
                if user_data:
                    openid,session_key=user_data.split("&")
                    user_info=WXBizDataCrypt.WXBizDataCrypt.main(session_key,param.get('encrytedData'),param.get('iv'))
                    save_data = {
                        'name': user_info['nickName'],
                        'avatar': user_info['avatarUrl'],
                        'language': user_info['language'],
                        'province': user_info['province'],
                        'city': user_info['city'],
                        'country': user_info['country'],
                        'gender': user_info['gender'],
                    }
                    models.wx_user.objects.filter(openid=openid).update(**save_data)
                    user_info= models.wx_user.objects.filter(openid=openid).first()
                    data=Wxuser(instance=user_info,many=False).data
                    return Response({
                    'code':200,
                    "msg":"token错误",
                    "data":data
    
                    })
    
                else:
                    return Response({
                    'code':200,
                    "msg":"token错误"
                })
    
            else:
                return Response({
                    'code':200,
                    "msg":"参数错误"
                })

     支付文档分析

     前台代码

    pay:function(){                                                    
        
          wx.request({
            url: app.globalData.apiurl+"api/pay",
            header:{"content-type":"application/json"},
            data:{"token":wx.getStorageSync("token")},
            method:"POST",
            success:function(res){
              wx.requestPayment(
                {
                  'timeStamp': res.data.data.timeStamp,
                  'nonceStr': res.data.data.nonceStr,
                  'package': res.data.data.package,
                  'signType': res.data.data.signType,
                  'paySign': res.data.data.paySign,
                  'success': function (res) {
                    console.log(res)
                   },
                  'fail': function (res) {
                    console.log(res)
                   },
                  'complete': function (res) { }
                })
            }
    
          })
      }
    })

    Django代码

    settings:

      配置文件

    views:

    from  rest_framework.views import APIView
    from rest_framework.response import Response
    from django.core.cache import cache
    from app01.wx import settings
    import random,time,hashlib,requests
    import xml.etree.ElementTree as ET
    
    class Pay(APIView):
        def post(self,request):
            param=request.data
            if param.get("token"):
                data=cache.get(param.get("token"))
                if data:
                    self.openid=data.split("&")[0]
                    self.ip=request.get_host().split(":")[0]
                    re_data=self.once_pay()
                    return Response({
                        "code": 200,
                        "msg": "ok",
                        "data":re_data
                    })
                else:
                    return Response({
                        "code": 200,
                        "msg": "缺少参数"
                    })
    
            else:
                return Response({
                    "code":200,
                    "msg":"缺少参数"
                })
    
        def get_nonce_str(self):
            all="1234567890abcdefghijklmnopqrstuvwxyz"
            nonce_str=''.join(random.sample(all,30))
            return nonce_str
    
    
        def get_order_id(self):
            order_id=time.strftime("%Y%m%d")
            all = "1234567890abcdefghijklmnopqrstuvwxyz"
            nonce_str = ''.join(random.sample(all, 5))
            order_id=order_id+nonce_str
            return order_id
        def get_sign(self):
            data_dic = {
                "nonce_str": self.nonce_str,
                "out_trade_no": self.out_trade_no,
                "spbill_create_ip": self.spbill_create_ip,
                "notify_url": self.notify_url,
                "openid": self.openid,
                "body": self.body,
                "trade_type": "JSAPI",
                "appid": self.appid,
                "total_fee": 1,
                "mch_id": self.mch_id
            }
            strA="&".join([f"{k}={data_dic[k]}" for k in sorted(data_dic)])
            sign_str=f"{strA}&key={settings.pay_apikey}"
            md5=hashlib.md5()
            md5.update(sign_str.encode("utf-8"))
            sign=md5.hexdigest().upper()
            return sign
    
        def xml_to_dic(self,xml_data):
            data=ET.fromstring(xml_data)
            xml_dic={}
            for child in data:
                xml_dic[child.tag]=child.text
            return  xml_dic
    
    
        def  get_two_sign(self,data):
            timeStamp=str(int(time.time()))
            data_dic = {
                'appId': data['appid'],
                'timeStamp': timeStamp,
                'nonceStr': data['nonce_str'],
                'package': f"prepay_id={data['prepay_id']}",
                "signType": "MD5"
            }
            strA = "&".join([f"{k}={data_dic[k]}" for k in sorted(data_dic)])
            sign_str = f"{strA}&key={settings.pay_apikey}"
            md5 = hashlib.md5()
            md5.update(sign_str.encode("utf-8"))
            sign = md5.hexdigest().upper()
            re_dict={
                'timeStamp':timeStamp,
                "nonceStr":data['nonce_str'],
                "package":f"prepay_id={data['prepay_id']}",
                "paySign":sign,
                "signType":"MD5"
            }
            return re_dict
    
    
    
    
        def once_pay(self):
            self.appid=settings.AppId
            self.mch_id=settings.pay_mchid
            self.nonce_str=self.get_nonce_str()
            self.body="兵哥支付"
            self.out_trade_no=self.get_order_id()
            self.total_fee=1
            self.spbill_create_ip=self.ip
            self.notify_url="http://test.com"
            self.trade_type="JSAPI"
            self.openid=self.openid
            self.sign = self.get_sign()
            body_data = f"""
                   <xml>
                       <appid>{self.appid}</appid>
                       <mch_id>{self.mch_id}</mch_id>
                       <nonce_str>{self.nonce_str}</nonce_str>
                       <sign>{self.sign}</sign>
                       <body>{self.body}</body>
                       <out_trade_no>{self.out_trade_no}</out_trade_no>
                       <total_fee>1</total_fee>
                       <spbill_create_ip>{ self.spbill_create_ip}</spbill_create_ip>
                       <notify_url>{self.notify_url}</notify_url>
                       <openid>{self.openid}</openid>
                       <trade_type>JSAPI</trade_type> 
                   </xml>"""
            pay_url="https://api.mch.weixin.qq.com/pay/unifiedorder"
            response=requests.post(pay_url,data=body_data.encode("utf-8"),headers={"content-type":"application/xml"})
            xml_data=response.content
            xml_dict=self.xml_to_dic(xml_data)
            data=self.get_two_sign(xml_dict)
            return data
    
     

     消息模板显示

     

     

  • 相关阅读:
    第10组 Alpha冲刺 (2/6)
    第10组 Alpha冲刺 (1/6)
    第10组(72) 需求分析报告
    团队介绍及选题报告
    实验 7 : OpenDaylight 实验 —— Python 中的 REST API 调用
    第03组 Alpha冲刺 总结
    第03组 Alpha冲刺 (6/6)
    第03组 Alpha冲刺 (5/6)
    第03组 Alpha冲刺 (4/6)
    第03组 Alpha冲刺 (3/6)
  • 原文地址:https://www.cnblogs.com/klw1/p/11427501.html
Copyright © 2011-2022 走看看