微信app支付python代码实现

微信app支付python代码(使用weixin-python==0.5.4)

微信app支付python代码(python2)
python3应该差不多,

官方文档:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1

业务流程:

商户系统和微信支付系统主要交互说明:

#步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
用户在app页面选择商品,确定数量,提交订单,提供必要的参数
app支付需要的前端参数
1. body  商品描述
2. total_fee 商品价格

#步骤2: 商户后台生成本地订单
生成订单号,保证唯一性
order_sn = "%s%s%s" % (request.user.id, datetime.datetime.now().strftime('%Y%m%d%H%M%S'),
                                   random.randint(1, 99))
根据订单号,生成本地订单(生成订单对象,订单状态肯定是未支付,支付成功的回调时再改为支付成功状态)
def generate_order(user, post_data, order_sn, nickname, openid):
    good_kind = post_data.get("good_kind")
    good_id = post_data.get('good_id')
    paid_amount = post_data.get('paid_amount', 0)
    try:
        good_kind = int(good_kind)
        good_id = int(good_id)
        paid_amount = float(paid_amount)
        #1 课程  2 会员卡
        if good_kind == 1:
            course = Course.objects.get(pk=good_id)
            record = Record.objects.create(
                user=user, course=course, telephone=user.phone, center=get_center_for_appid(),
                price=paid_amount, order_sn=order_sn, nickname=nickname, openid=openid)
            if not paid_amount:
                record.status = 2
                record.save()
        elif good_kind == 2:
            card = Vip.objects.get(pk=good_id)
            record = Record.objects.create(
                user=user, card=card, price=paid_amount, center=get_center_for_appid(),
                order_sn=order_sn, nickname=nickname, telephone=user.phone, openid=openid)
        else:
            record = None
    except Exception as e:
        record = None
    return record

#步骤3:调用微信支付统一下单接口。参见【统一下单API】。
使用pip install weixin-python==0.5.4(模块)
1.导入from weixin import Weixin
2.初始化(https://www.cnblogs.com/gjh99/p/10536905.html)
we_chat = Weixin(dict(
    #app_id 微信开放平台审核通过的应用APPID(请登录open.weixin.qq.com查看,注意与公众号的APPID不同)
    WEIXIN_APP_ID=WECHAT_APP_ID,
    #mch_id 微信支付分配的商户号
    WEIXIN_MCH_ID=WECHAT_MCH_ID,
    #mch_key 微信支付密钥
    WEIXIN_MCH_KEY=WECHAT_MCH_KEY,
    #回调url
    WEIXIN_NOTIFY_URL=WECHAT_NOTIFY_URL,
    #公钥文件
    WEIXIN_MCH_KEY_FILE='',
    #私钥文件
    WEIXIN_MCH_CERT_FILE=''
))

3.调用模块封装好的方法
必传的参数如下,微信的支付为分
jsdict = we_chat.jsapi(
    #订单号
    out_trade_no=order_sn,
    #商品描述
    body=body,
    #支付金额
    total_fee=int(float(total_fee)*100),
    #交易类型
    trade_type='APP'
)

4.接收微信后台返回的数据字典jsdict,需要返回给前台
{
    "status": 1,
    "data": {
        "appId": "你的appid",
        "package": "prepay_id=wx11162703519516e69f7864b91520314800",
        "prepay_id": "wx11162703519516e69f7864b91520314800",
        "timeStamp": "1576052824",
        "nonceStr": "pqfQOyiMs8d9aAqhS7g8n9WCCyjHPYc6",
        "signType": "MD5",
        "sign": "396451156447F8DB4590E4ADE5C041AD"
    }
}
5.微信app支付需要重新生成签名
统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay

new_sign = app_pay_sign(jsdict, we_chat)

#注意 字典的参数要跟微信要求的一模一样,就是data的key要完全和下面的代码一样
def app_pay_sign(jsdict, we_chat):
    try:
        data = dict()
        data["appid"] = jsdict["appId"]
        data["partnerid"] = WECHAT_MCH_ID
        data["prepayid"] = jsdict["prepay_id"]
        data["noncestr"] = jsdict["nonceStr"]
        data["timestamp"] = jsdict["timeStamp"]
        data["package"] = jsdict["package"]
        return we_chat.sign(data)
    except KeyError:
        return

6. 重新签名后将数据返回给前端,后台就算完成了
jsdict["sign"] = new_sign

7. 写回调函数
@api_view(['POST'])
@permission_classes([AllowAny])
def wechat_callback(request):
    if request.method == 'POST':
        try:
            data = we_chat.to_dict(request.body)
            order_sn = data.get('out_trade_no', '')
            # 支付结果,用户正常支付,会返回SUCCESS
            result_code = data.get('result_code', '')
            # check 检查微信回传数据是否可靠
            if not we_chat.check(data):
                return HttpResponse(we_chat.reply("签名验证失败", False))
            if result_code == 'SUCCESS':
                return HttpResponse(we_chat.reply("OK", True), content_type='text/xml')
        except Exception as e:
            return HttpResponse(we_chat.reply("签名验证失败", False), content_type='text/xml')

#后台python代码
class WeChatPayViewSet(viewsets.ViewSet):
    permission_classes = (IsAuthenticated,)

    @list_route(methods=["POST"])
    def app_pay(self, request, *args, **kwargs):
        try:
            post_data = request.DATA
            body = post_data.get('body', '微信支付测试')
            total_fee = post_data.get('total_fee', 0.01)
            if not total_fee:
                return Response({"status": 0, "errormsg": "缺少参数"})
            # 订单号生成规则:用户id+当前时间+随机数
            order_sn = "%s%s%s" % (request.user.id, datetime.datetime.now().strftime('%Y%m%d%H%M%S'),
                                   random.randint(1, 99))
            # 生成本地订单
            order = generate_order()
            jsdict = we_chat.jsapi(out_trade_no=order_sn, body=body, total_fee=int(float(total_fee)*100),
                                   trade_type='APP')
            jsdict["prepay_id"] = jsdict.get("package").split("=")[-1]
            new_sign = app_pay_sign(jsdict, we_chat)
            if not new_sign:
                return Response({"status": 0, "errormsg": "调用微信统一下单接口失败,缺少必要参数"})
            jsdict["sign"] = new_sign
            return Response({"status": 1, "data": jsdict})
        except Exception as e:
            return Response({"status": 0, "errormsg": e})

#步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】
#步骤5:商户后台接收支付通知。api参见【支付结果通知API】
#步骤6:商户后台查询支付结果。,api参见【查询订单API】

原文地址:https://www.cnblogs.com/robert-zhou/p/12023426.html

时间: 2024-10-28 11:32:34

微信app支付python代码实现的相关文章

小黑式烂代码之微信APP支付 + 退款(JAVA实现)

首先,你得先有微信开发平台账号密码还需要开通应用,然后还有微信服务商平台商户版账号(这些我都是给产品经理拿的) 其次我认为你先去看一看微信开发平台的文档!  https://pay.weixin.qq.com/wiki/doc/api/index.html 这里有很多种支付,我就采用APP支付来说了(会了APP支付其实H5支付都差不多的!) 进来后是这样的,随便看看'APP支付那几篇文章'讲的流程!,看完后知道大概了就可以看看'API列表了' 我们后台开发需要关注的就是这三个API了! 1 /*

微信app支付android客户端以及.net服务端实现

由于公司运营需要,需要在客户端(android/ios)增加微信以及支付宝支付,在调用微信app支付时遇到一些问题,也算是一些踩过的坑,记录下来 ,希望能对.net开发者服务端网站更快的集成微信app支付. 1.开发所需资料:微信开放平台应用的appid以及appsecert,商户平台的商户号以及api安全里面里面设置的key,详见 微信支付账户相关信息; 2.微信开发者平台完善应用平台的相关信息,android应用签名必须用打包签名过的发布版本apk(这一步很重用),包名必须一致,可以用微信提

微信app支付php开发

前几天做微信app支付,遇到了支付失败的问题,app进行支付的时候,返回-1.查了好多资料,没找到.后来经过排查,是因为签名的问题.不多说,直接上代码.服务器端的demo版本是v3. require(dirname(dirname(__FILE__))."/lib/WxPay.Api.php");            //生成订单            $out_trade_no = trim($_POST['orderid']);            //总金额(1表示1分钱) 

关于被微信App支付坑的过程

最近因为项目要接入微信App支付(没做过,不了解),然后就开网上一番狂搜+看官方文档,那是一个乱七八糟. 微信在2014年9月10号更新出了v3的版本,结果我竟然拿着v2版本在那里调试=>被坑. 回归到正题:希望接下来的朋友少走一些弯路. 微信总共有三个平台: 公众号平台:https://mp.weixin.qq.com/ 商户平台:https://pay.weixin.qq.com 开放平台:https://open.weixin.qq.com/ 这里所提到的微信App支付则是用到开放平台.

微信app支付(android端+java后台)

本文讲解使用微信支付接口完成在android开发的原生态app中完成微信支付功能, 文章具体讲解了前端android如何集成微信支付功能以及后台如何组装前端需要支付信息, 话不多话, 具体看文章内容吧00:00 / 07:03正常 本实例项目运行条件: 开发环境: [Android Studio] 到微信开放平台注册帐号并且创建移动应用 https://open.weixin.qq.com/cgi-bin/frame?t=home/app_tmpl&lang=zh_CN Column 1 Col

微信App支付(JAVA端)

low话不多说,直接上代码! 红色框框是核心jar包! 黑色框框是获取客户端的IP地址工具类! 紫色框框是微信支付的流程代码! 蓝色框框是订单实体类! 由于小黑我技术不咋地,所以以下代码仅供参考,copy过去后是跑不起来的,不过可以经过改动代码使其跑起来,反正思路是这样的! (代码处如有发现错误的自行矫正修改,例如没有对事务控制,逻辑有误等!! 还有,大神看也,不喜勿喷) 此处代码就是用来调用微信支付SDK的,然后SDK会返回几个参数,这几个参数就是给APP端(IOS/安卓)调起支付的参数!! 

.Net后台实现微信APP支付

上一节分享了微信小程序支付的后台,这一节来分享一下微信APP支付的后台.微信APP支付和微信小程序差别不大,微信APP支付后台不需要微信登录凭证.后台下单时交易类型(trade_type)不再是"JSAPI",而是"APP".商户后台传递给支付端的下单参数也有所不同.由于微信小程序支付和APP支付使用的APPID不同,索性直接写了两套支付,不再在代码里区分究竟该使用小程序支付的配置参数还是APP支付的参数. 官方是这样介绍的 具体实现: 新建AppPayConfig

微信APP支付的坑 - errorcode=-1

关于微信App支付errorcode=-1的原因网上的大多数的说明和微信的官方文档差不多,不外乎app签名包名对应问题,这些原因都很好排除. 但最要命的就是下图标3 其他异常! 这是[调起微信支付接口]要传递的参数以及返回结果说明,其中标1和标2很有意思,有意思在哪呢?就是微信在这里告诉你怎么生成对应的数据,但如果真实环境中你就这么用了,那返回结果肯定是-1. 那这两个参数我们要用什么呢? 答案是[调起微信支付]前的上一步[统一下单]中签名用到的随机字符串和时间戳,但可惜的是文档中并没有明确说明

微信app支付 ci框架做的

/**     * 组合微信app支付  获得prepayid     * @param int $order_num     */    private function _wxpay_request($order_num = 0)    {                //判断订单编号必须是数组并且不为0        check_order_num($order_num); //引入微信支付类            libraries_include("wxpay/", &qu