前言
微信公众号开发又一重要项就是微信支付,如何在微信公众号中或者微信自带的浏览器中实现微信支付呢?这就是本文的目的。
对于微信支付有几种分类,一种是app支付(顾名思义给予一些软件app使用的)、微信内H5支付(什么意思呢,就是微信内置的浏览器自带了一些js、css文件,当然是微信特有的,上篇博客有讲过,获取到的用户昵称带表情会乱码,在微信自带的浏览器你只要将它装换为utf-8就能正常显示,原因是内置浏览器有对应的font文件,所以在内置浏览器中也有包含了支付功能的js文件,没错在微信自带的浏览器中你不用在你的html中引入js都可以使用它的内置js,本文会讲解如何用它的js调起支付)、其它PC端浏览器的扫码支付。
开发流程
- 服务器
同样需要服务器,然后设置服务器的域名,比如这里还是设置域名为:www.show.netcome.net
。 配置公众号收集信息
首先需要一个有微信支付权限和网页授权权限的公众号,其次需要一个有微信支付权限的商户号(商户号就是支付的钱到哪里)。同样,登录公众平台在开发–>基本配置–>公众号开发信息里找到公众号的开发者ID(AppID)和开发者密码(AppSecret) ,然后在微信商户平台里找到mch_id和api密钥。
注意:必须先在微信公众平台设置网页授权域名(这个域名你就填服务器的www.show.netcome.net
)和在微信商户平台设置您的公众号支付支付目录,设置路径:商户平台–>产品中心–>开发配置–>公众号支付–>添加(添加一个支付url,比如你的支付页面是:www.show.netcome.net/payment
)。公众号支付在请求支付的时候会校验请求来源是否有在商户平台做了配置,所以必须确保支付目录已经正确的被配置,否则将验证失败,请求支付不成功。开发流程
微信支付不是说一开始就传订单编号、价格、商品等信息去调用支付的,在调用支付接口前我们需要先去向微信发起下单请求,只有发起下单成功后才能调用支付接口。
首先配置你的公众号、商户和回调页面信息,其它值做相应修改,参数文件如下:
# -*- coding: utf-8 -*-
# ----------------------------------------------
# @Time : 18-3-21 上午11:50
# @Author : YYJ
# @File : wechatConfig.py
# @CopyRight: ZDWL
# ----------------------------------------------
"""
微信公众号和商户平台信息配置文件
"""
# ----------------------------------------------微信公众号---------------------------------------------- #
# 公众号id
APPID = 'appid'
# 公众号AppSecret
APPSECRET = 'appscrect'
# ----------------------------------------------微信商户平台---------------------------------------------- #
# 商户id
MCH_ID = 'mc_id'
# 商户API秘钥
API_KEY = 'api秘钥'
# ----------------------------------------------回调页面---------------------------------------------- #
# 用户授权获取code后的回调页面,如果需要实现验证登录就必须填写
REDIRECT_URI = 'http://meili.netcome.net/index'
PC_LOGIN_REDIRECT_URI = 'http://meili.netcome.net/index'
defaults = {
# 微信内置浏览器获取code微信接口
'wechat_browser_code': 'https://open.weixin.qq.com/connect/oauth2/authorize',
# 微信内置浏览器获取access_token微信接口
'wechat_browser_access_token': 'https://api.weixin.qq.com/sns/oauth2/access_token',
# 微信内置浏览器获取用户信息微信接口
'wechat_browser_user_info': 'https://api.weixin.qq.com/sns/userinfo',
# pc获取登录二维码接口
'pc_QR_code': 'https://open.weixin.qq.com/connect/qrconnect',
# 获取微信公众号access_token接口
'mp_access_token': 'https://api.weixin.qq.com/cgi-bin/token',
# 设置公众号行业接口
'change_industry': 'https://api.weixin.qq.com/cgi-bin/template/api_set_industry',
# 获取公众号行业接口
'get_industry': 'https://api.weixin.qq.com/cgi-bin/template/get_industry',
# 发送模板信息接口
'send_templates_message': 'https://api.weixin.qq.com/cgi-bin/message/template/send',
# 支付下单接口
'order_url': 'https://api.mch.weixin.qq.com/pay/unifiedorder',
}
SCOPE = 'snsapi_userinfo'
PC_LOGIN_SCOPE = 'snsapi_login'
GRANT_TYPE = 'client_credential'
STATE = ''
LANG = 'zh_CN'
下面就是支付下单和支付接口调用的封装代码了,其中包括了上一篇博客的授权登录代码和下一篇博客的发送模板消息的代码封装:
# -*- coding: utf-8 -*-
# ----------------------------------------------
# @Time : 18-3-21 下午1:36
# @Author : YYJ
# @File : WechatAPI.py
# @CopyRight: ZDWL
# ----------------------------------------------
import hashlib
import random
import time
from urllib import parse
from xml.etree.ElementTree import fromstring
import requests
from src.beauty.main.wechat.config import wechatConfig
class WechatAPI(object):
def __init__(self):
self.config = wechatConfig
self._access_token = None
self._openid = None
self.config = wechatConfig
self.dic = {}
@staticmethod
def process_response_login(rsp):
"""解析微信登录返回的json数据,返回相对应的dict, 错误信息"""
if 200 != rsp.status_code:
return None, {
'code': rsp.status_code, 'msg': 'http error'}
try:
content = rsp.json()
except Exception as e:
return None, {
'code': 9999, 'msg': e}
if 'errcode' in content and content['errcode'] != 0:
return None, {
'code': content['errcode'], 'msg': content['errmsg']}
return content, None
def process_response_pay(self, rsp):
"""解析微信支付下单返回的json数据,返回相对应的dict, 错误信息"""
rsp = self.xml_to_array(rsp)
if 'SUCCESS' != rsp['return_code']:
return None, {
'code': '9999', 'msg': rsp['return_msg']}
if 'prepay_id' in rsp:
return {
'prepay_id': rsp['prepay_id']}, None
return rsp, Non