xml格式错误

来源:12-6 支付下单和拉起支付功能

慕圣4887435

2020-05-02

老师,我还没有申请支付,然后用其他字符串代替,显示xml格式错误(如图)
顺序和其他同学的有点不同会不会影响?
是不是只要申请支付后有mch和paykey就可以了?图片描述

写回答

4回答

编程浪子

2020-05-04

你好

你这种没有就把prepay_id 设置为 0 看看,大致的意识就把这个东西绕过去

pay_order_info.prepay_id = pay_info['prepay_id'] if  pay_info['prepay_id'] != None else 0

或者直接把如下几行删除了

#保存prepay_id为了后面发模板消息
pay_order_info.prepay_id = pay_info['prepay_id']
db.session.add( pay_order_info )
db.session.commit()


//img1.sycdn.imooc.com/szimg/5eafc47809039a9409500654.jpg



0
0

慕圣4887435

提问者

2020-05-03

首先,点击支付后报500 错误,其中提示prepay_id为空

//img1.sycdn.imooc.com/szimg/5eae32a30867899416070139.jpg

我就把prepay_id来源打印出来查看

//img.mukewang.com/szimg/5eae32a308f5f26c08710228.jpg

由于没有paykey,报了xml格式错误,没有prepay_id//img1.sycdn.imooc.com/szimg/5eae32a30829502610600043.jpg

请问这种情况,除了没有paykey的原因外,有没有我的操作错误呢?

还没看12-18章,请问有能解决的办法吗



0
0

编程浪子

2020-05-02

你好

没明白什么意思? 如果要做支付就必然是要申请支付权限的。

课程后面也做了更新,担心大家没有支付权限,给大家做了一些方法让大家体验过程

//img.mukewang.com/szimg/5ead86880955f6c114280830.jpg

0
2
慕圣4887435
老师 截图信息发在上面了
2020-05-03
共2条回复

慕圣4887435

提问者

2020-05-02

import hashlib,requests,uuid
import xml.etree.ElementTree as ET
from application import app
class WeChatService():
    def __init__(self,merchant_key = None):
        self.merchant_key = merchant_key

    def create_sign(self,pay_data):
        '''
        生产签名
        :param pay_data:
        :return:
        '''
        stringA = "&".join(["{0}={1}".format( k,pay_data.get(k) ) for k in sorted( pay_data )] )
        stringSignTemp = '{0}&key={1}'.format( stringA,self.merchant_key )
        sign = hashlib.md5( stringSignTemp.encode("utf-8") ).hexdigest()
        return sign.upper()

    def get_pay_info(self,pay_data = None):
        '''
        获取支付信息
        '''
        sign = self.create_sign( pay_data )
        pay_data['sign'] = sign
        xml_data = self.dic_to_xml( pay_data )
        headers = {
            'Content-Type':'application/xml'
        }
        url = "https://api.mch.weixin.qq.com/pay/unifiedorder"
        r = requests.post( url = url, data = xml_data.encode("utf-8"), headers = headers)
        r.encoding = "utf-8"
        app.logger.info(r.text)
        app.logger.info(xml_data)

    def dic_to_xml(self,dict_data):
        '''
           dict to xml
           :param dict_data:
           :return:
        '''
        xml = [ "<xml>" ]
        for k,v in dict_data.items():
            xml.append( "<{0}>{1}</{0}>".format(k,v) )
        xml.append( "<xml>" )
        return "".join( xml )

    def xml_to_dic(self,xml_data):
        '''
            xml to dict
            :param xml_data:
            :return:
        '''
        xml_dict = {}
        root = ET.fromstring(xml_data)
        for child in root:
            xml_dict[ child.tag ] = child.text
        return xml_dict

    def get_nonce_str(self):
        return str( uuid.uuid4() ).replace('-', '')

上面的是WeChatService,下面的是Order.py里的内容

target_wechat = WeChatService( merchant_key = config_mina['paykey'] )
data = {
   'appid': config_mina['appid'],
   'mch_id': config_mina['mch_id'],
   'nonce_str': target_wechat.get_nonce_str(),
   'body': '订餐',  # 商品描述
   'out_trade_no': pay_order_info.order_sn,  # 商户订单号
   'total_fee': int(pay_order_info.total_price * 100),
   'notify_url': notify_url,
   'trade_type': "JSAPI",
   'openid': oauth_bind_info.openid
}
target_wechat.get_pay_info( data )
0
1
巴赫
同学,你的问题解决了吗?我的sign值好像有问题,模拟回调一直是fail
2020-05-04
共1条回复

Python Flask构建微信小程序订餐系统(可用于毕设)

微信小程序 + Python Flask 打造订餐系统全栈应用,可用于毕设。

1709 学习 · 1889 问题

查看课程