如何在微信内部iframe使用支付宝

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在微信内部iframe使用支付宝相关的知识,希望对你有一定的参考价值。

参考技术A 微信不能使用支付宝支付,如果要在微信上支付,可以绑定银行卡,使用微信支付。
  使用微信支付步骤:
  1、打开微信,点击下方的“我”工具,会看到“我的银行卡”选项,点击进入,选择话费充值功能,这里以给指定号码充值30为例;
  2、首先需要绑定银行卡,在新的界面中输入银行卡号,储蓄卡、信用卡都可以;
  3、输入银行卡号完成后点击“下一步”,输入用户的具体信息,包括身份证号、姓名、手机号等等;
  4、各项信息输入完成后,点击“下一步”,如果各项信息完整且无误,那么会进入新的界面,否则会提示错误;
  5、进入的新界面中需要输入手机收到的验证码,虽然多了这个步骤,不过也增加了安全系数;
  6、验证码输入成功点击“下一步”,由于是初次使用,要对微信进行6位支付密码设置,并重复设置确认;
  7、密码设置成功并确认后,如果两次密码设置相同则支付成功;
  8、支付成功后,银行卡绑定也自然完成了,这是“我的银行卡”功能选项下会显示绑定的银行卡;
  9、相比支付宝多了的功能是,微信能够通过绘画的形式提示支付进度。如支付完成时,微信会发信息提示充值已经成功。本回答被提问者采纳

关于在微信支付接口和支付宝接口中使用到的辅助函数

刚才在shell中敲代码的时候,习惯性地用tab键去补全,然后就一直报错,所以以后记得不要在vim编写代码的时候去用tab补全。

然后现在是总结一下在生成两个接口数据时使用到的一些辅助函数,因为我自己是先开发微信支付接口使用的,所以先总结微信支付的函数,首先是生成随机字符串,我自己是先生成一个26个小写字母和0到9的数字的字符串,然后从中随机挑选32个字符加入一个list,然后用join联合函数直接组成随机字符串,代码如下:

    def nonce_str(self):
        # 生成随机字符
        chars = abcdefghigklmnopqrstuvwxyz0123456789
        strs = []
        for x in range(32):
            strs.append(chars[random.randrange(0, len(chars))])
        return "".join(strs)

然后就是微信支付的计算签名,首先是将已有的键值对按照ascii排序,然后生成型如a=b&c=d的形式,接着将微信提供的商户的密钥也以这种键值对的形式加入到组合字符串当中,然后利用hashlib中的MD5摘要算法对字符串进行加密,然后将生成的签名大写,返回就可以了。

    def sign(self, params):
        # 计算签名
        params_str = "&".join("{0}={1}".format(k, params[k]) for k in sorted(params) if k != sign and params[k])
        params_str = {0}&key={1}.format(params_str, self.key)
        params_str = hashlib.md5(params_str.encode(utf-8)).hexdigest()
        signvalue = params_str.upper()
        return signvalue

因为微信支付只接收xml字符串,所以还需要自己生成xml信息,我采用数组的方式将其对应值生成了数组中的一个元素,最终使用join函数将数组转换为字符串。

    def arrayToXml(self, arr):
        """array转xml,生成订单信息"""
        xml = ["<xml>"]
        for k, v in arr.items():
            xml.append("<{0}>{1}</{0}>".format(k, v))
        xml.append("</xml>")
        return "".join(xml)

相应的,微信返回的信息是xml格式的,所以为了查看返回信息,我是需要去转换格式的,然后我用的是python自带的xml.etree.ElementTree,调用函数的fromstring方法,对xml信息进行解析。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import xml.etree.ElementTree as ET

    def xmlToArray(self, xml):
        """将xml转为array"""
        array_data = {}
        root = ET.fromstring(xml)
        for child in root:
            value = child.text
            array_data[child.tag] = value
        return array_data

然后微信支付的退款接口是需要双向证书验证的,所以我使用了pycurl模块,在我的另一篇随笔中有专门的介绍,然后微信验证还有验证签名和处理回传信息乱码两个问题,验证签名的思路就是把回传的信息进行重新签名,然后拿出来与回传信息中的签名作对比,就可以决定时返回True还是False了。修复回传信息乱码我是直接将回传数据写成字节形式,然后再用utf-8解码。

 

支付宝接口相对来说就有点不一样了,不过大致思路还是一样的,也是按照相应的要求去生成订单信息。首先支付宝除了公共数据外每一个订单biz_content,所以就要先进行排序,对于参数中某些类型是字典的元素,要利用json的dumps方法将其转变为字符串,最终返回一个排序好了的list,其中每个元素为一个元组。

   def ordered_data(self, data):
        for k, v in data.items():
            if isinstance(v, dict):
                data[k] = json.dumps(v, separators=(,, :))

        return sorted([(k, v) for k, v in data.items()])

然后生成订单信息就和微信支付差不多了,不过签名的方式是完全不一样的,生成签名的方法可以查看支付宝开放文档。

 

以上是关于如何在微信内部iframe使用支付宝的主要内容,如果未能解决你的问题,请参考以下文章

如何在微信中接入支付宝支付

iOS如何应对苹果抽成-支付宝篇

微信浏览器中调用支付宝支付

微信支付宝支付开发用iframe成功后怎么跳出iframe

关于在微信支付接口和支付宝接口中使用到的辅助函数

微信公众号无法使用支付宝