j j游戏怎么玩游戏使用微信支付付

最近微信APP支付遇到的一些坑 - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
最近微信支付莫名其妙的进行了升级,在提交的移动应用开发中微信支付,如果收到的是这样的则无法使用在开放平台的移动应用开发的。因为邮件中少了2个关键的KEY:paySignKey, partnerKey。
一直询问支持,给的都是,研究了下,都是公众号的开发。
后面找到了这份,研究了一番,依旧觉得是公众号的,里面的需要个openid,这分明是微信公众号的开发。后面看到openid只是在公众号开发的时候才传递,所以决定按照这份文档一试。
按照文档中的,当进行到第三步的时候,文档这样说:
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为prepay_id=wx
但是我我找遍了所有地方,都没有说明这个package具体的事例,以及参加签名的字段partnerId是老文档中的描述,而且这里的字符串怎么突然有大小写了?后面参考了老文档,成功了。
3.5 添加 prepayid 再次签名
获取到 prepayid 后,将参数 appid、appkey、noncestr、package(注意:此处应置为 Sign=WXPay)、partnerid、prepayid、timestamp 签名后返回给 APP,签名方法跟 3.4 节
app_signature 说明一致。得到参数列表如下,通过这些参数即可在客户端调起支付。
“appid”:“wxd930ea5d5a258f4f”, “noncestr”:“7a773f894d”, “package”:“Sign=WXpay”;
“partnerid”:“” “prepayid”:“f”, “sign”:“7ffecb600d810d2d8f28bc2811827b”, “timestamp”:“”
总结下开发:
先按照去获取prepay_id
得到prepay_id, 参考上面的 3.5 添加 prepayid 再次签名
然后再吐槽下微信支付:新接口获取prepay_id确实方便了很多,不需要去获取token、packge,请求与接收都有JSON换成了XML。但接口更新也不正式的声明下,文档也乱写,也没用完全开放出来,坑啊!
#!/usr/bin/env python
# coding=utf-8
xml2json:https:/&#/hay/xml2json
log_debug, log_info 相当于print
from flask import current_app
from aladin.helpers import log_debug, log_info
from hashlib import md5
import requests, time, json
from xml.etree import ElementTree
from xml2json import xml2json
import optparse
class WeiXinPay():
&&&微信支付,返回回客户端需要参数
def __init__(self, order_id, body, total_fee, nonce_str, spbill_create_ip='8.8.8.8'):
:param order_id: 订单ID
:param body: 订单信息
:param total_fee: 订单金额
:param nonce_str: 32位内随机字符串
:param spbill_create_ip: 客户端请求IP地址
self.params = {
'appid': current_app.config['APPID'],
'mch_id': current_app.config['MCHID'],
'nonce_str': nonce_str,
'body': body,
'out_trade_no': str(order_id),
'total_fee': str(int(total_fee)),
'spbill_create_ip': spbill_create_ip,
'trade_type': 'APP',
'notify_url': current_app.config['WEIXIN_NOTIFY_URL']
self.url = 'https://api.mch./pay/unifiedorder' # 微信请求url
self.error = None
def key_value_url(self, value):
&&&将将键值对转为 key1=value1&key2=value2
key_az = sorted(value.keys())
pair_array = []
for k in key_az:
v = value.get(k, '').strip()
v = v.encode('utf8')
k = k.encode('utf8')
log_info('%s =& %s' % (k,v))
pair_array.append('%s=%s' % (k, v))
tmp = '&'.join(pair_array)
log_info(&key_value_url ==& %s & %tmp)
return tmp
def get_sign(self, params):
&&&生成sign
stringA = self.key_value_url(params)
stringSignTemp = stringA + '&key=' + current_app.config['APIKEY'] # APIKEY, API密钥,需要在商户后台设置
log_info(&stringSignTemp ==& %s& % stringSignTemp)
sign = (md5(stringSignTemp).hexdigest()).upper()
params['sign'] = sign
log_info(&sign ==& %s& % sign)
def get_req_xml(self):
&&&拼接XML
self.get_sign(self.params)
xml = &&xml&&
for k, v in self.params.items():
v = v.encode('utf8')
k = k.encode('utf8')
xml += '&' + k + '&' + v + '&/' + k + '&'
xml += &&/xml&&
log_info(xml)
return xml
def get_prepay_id(self):
请求获取prepay_id
xml = self.get_req_xml()
headers = {'Content-Type': 'application/xml'}
r = requests.post(self.url, data=xml, headers=headers)
log_info(r.text)
log_info(&++++++++++++++++++++++++++&)
re_xml = ElementTree.fromstring(r.text.encode('utf8'))
xml_status = re_xml.getiterator('result_code')[0].text
log_info(&result_code ==& %s& % xml_status)
if xml_status != 'SUCCESS':
self.error = u&连接微信出错啦!&
prepay_id = re_xml.getiterator('prepay_id')[0].text
self.params['prepay_id'] = prepay_id
self.params['package'] = 'Sign=WXPay'
self.params['timestamp'] = str(int(time.time()))
def re_finall(self):
&&&得到prepay_id后再次签名,返回给终端参数
self.get_prepay_id()
if self.error:
sign_again_params = {
'appid': self.params['appid'],
'noncestr': self.params['nonce_str'],
'package': self.params['package'],
'partnerid': self.params['mch_id'],
'timestamp': self.params['timestamp'],
'prepayid': self.params['prepay_id']
self.get_sign(sign_again_params)
self.params['sign'] = sign_again_params['sign']
# 移除其他不需要返回参数
for i in self.params.keys():
if i not in [
'appid', 'mch_id', 'nonce_str',
'timestamp', 'sign', 'package', 'prepay_id']:
self.params.pop(i)
return self.params
class WeiXinResponse(WeiXinPay):
微信签名验证
def __init__(self, xml):
:param xml: 支付成功回调的XML
self.xml = xml
options = optparse.Values({&pretty&: False})
self.xml_json = json.loads(xml2json(self.xml, options))['xml']
self.sign = self.xml_json.get('sign', '')
def verify(self):
&&&验证签名&&&
self.xml_json.pop('sign')
self.get_sign(self.xml_json)
if self.sign != self.xml_json['sign']:
log_info(&signValue:%s !=
sing:%s& % (self.xml_json['sign'], self.sign))
return False
return True
不过,建议用nodejs写一个版本玩玩
恩,后面打算写个coffee的。
coffee真的很好用,哇哈哈
帅哥, 里的&下载&链接好像都不能点的,你是怎么下载SDK的呢?
打电话问过腾讯了,DEMO还在写中,只有被扫支付。所以只能看文档摸着过河,和参考原来的微信开放平台的移动应用开发https://open./cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN
非常感谢,没想到你还真回了,你的信息对我挺有用。
请问nonce_str
这个随机码是不是,获取prepay_id 与 第二次签名时 。都是用同一个。
nonce_str: 32位内随机字符串, 是同一个。
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的前段时间微信发布JS-SDK接口,其中包括了微信支付,然后就勾起了我一个想法,那是不是我可以在微信上做个H5朋友给我转钱啊,后来才觉得这个想法有多煞笔。
好吧,言归正传,我也是从0开发,摸索了很多资料,网上的教程详细不详细,我不知道,反正没有我的详细
微信网页支付,ASP.NET开发,往下看吧。
首先我要先说一下我遇到的几个问题
1、修改测试目录失败,mch_id和appid没有关联关系。
2、签名错误。
3、公众号支付签名错误,无法发起该交易。
第一个错误,我无奈了1整天时间,各种百度,谷歌,都没有找到这样的错误,千万别问客服啊,她们只会让你看文档,后来是直接联系的一个微信支付技术人员把appid给他之后就解决了,如果你们也遇到这样的问题可以发邮件给:wepayTS(微信支付技术支持)&&&
好,现在开始开发:
第一步:配置js-sdk配置信息
api: & &微信JS-SDK说明文档
使用JS-SDK 必须引用微信js文件:&script src="http://res./open/js/jweixin-1.0.0.js"&&/script&
然后 配置config 权限验证:
wx.config({
debug: false,
appId: 'wxc94d5d50202f9dcf', // 必填,公众号的唯一标识
timestamp: &%=wxconfig.timestamp%&,//时间戳
nonceStr: "&%=wxconfig.nonceStr%&",//随机字符串
signature: "&%=wxconfig.signature%&", //权限签名 与微信支付签名没有半毛钱关系
jsApiList: [
// 必填,需要使用的JS接口列表
'onMenuShareTimeline',
'onMenuShareAppMessage',
'getNetworkType',
'chooseWXPay'
所有的权限验证算吗 为了安全 需要在后台程序实现
这里的算法是用SHA1,字典排序,而微信支付全部用MD5,注意参数的大小写,url是当前请求网页的url 包括参数。#前面的所有。(需要去公众平台绑定安全域名否则会报invalid url domain 的错误)
/// &summary&
/// 获取JS-SDK签名包
/// &/summary&
/// &param name="appid"&&/param&
public wxHandleModel.wxJSconfig GetTicket(string url)
wxservice.wxSoapClient wxs = new wxservice.wxSoapClient();
wxs.Get_access_token(appid);
string ticket = wxs.Get_access_ticket(appid, false);
//验证算法签名的ticket,
wxHandleModel.wxJSconfig wxconfig = new wxHandleModel.wxJSconfig();
wxconfig.appId =
wxconfig.nonceStr = GenerateCheckCode(16); //随机字符串
wxconfig.timestamp = ConvertDateTimeInt(DateTime.Now);
wxconfig.signature = SHA1("jsapi_ticket=" + ticket + "&noncestr=" + wxconfig.nonceStr + "×tamp=" + wxconfig.timestamp + "&url=" + url);
api文档中说的非常的清楚,生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次
数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
wxservice 是我写的web service用来获取更新ticket的,这是看自己如何写方便,一定要缓存,ticket调取频率非常有限。
常见的错误:
invalid url domain &&当前页面所在域名与使用的appid没有绑定
invalid signature & & 签名错误,可以在wx.error函数中 写一个ajax,更新ticket,刷新当前页,如果还是出现这个错误的,检查签名生成参数。
the permission value is offline verifying & &&这个错误是因为config没有正确执行,或者是调用的JSAPI没有传入config的jsApiList参数中
function not exist & & & & & & & & & & &当前客户端版本不支持该接口,请升级到新版体验,好像是要6.01以上的版本
更多错误 看api吧。
签名写好之后,返回前台JS-sdk所有需要页面加载执行的函数需要写在微信加载事件中,wx.ready(function () { & & }); &
document.querySelector('#payOK').onclick = function () {
wx.chooseWXPay({
timestamp: &%=wxpayconfig.timestamp%&, // 支付签名时间戳
nonceStr: "&%=wxpayconfig.nonceStr%&", // 支付签名随机串
package: "&%=wxpayconfig.package%&", // 统一支付接口返回的package包
signType: "&%=wxpayconfig.signType%&", // 签名方式,'MD5'
paySign: "&%=wxpayconfig.paySign %&", // 支付签名
success: function (res) {
if(res.err_msg == "get_brand_wcpay_request:ok" )
alert("支付成功");
// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
这是微信支付点击支付执行的事件,当然支付签名和package包也要在后台实现
第二步:微信支付参数和签名
如果你没有遇到我上面说的第一个问题的话,那么你应该可以直接在微信支付的开发配置中设置 测试支付目录,ok,下面签名算法
使用微信支付前都是通过 &统一下单& 接口为当前设置一个预支付交易会话标识:prepay_id,支付签名和package包都需要用到他。
请求参数并不是所有的都需要,如果你JSAPI支付的话那么openid必须有,如果是NATIVE那么商品ID必须有,文档写的很详细,我是JSAPI支付
protected Hashtable Parameters = new Hashtable();
//请求参数集合
string appid = ConfigurationManager.AppSettings["appid"]; //appid
string appkey = ConfigurationManager.AppSettings["appkey"]; //商户密匙
string mchid = ConfigurationManager.AppSettings["mchid"]; //商户号
这里appkey要说明一下,这是微信支付审核成功之后会收到一封邮件,邮件中有appid 商户号,商户后台登录上号和密码,登录到商户后台:账户设置-安全设置-切换到API安全,下载证书,下面有一个api密匙,进去填写一个字符串 ,保存,后续两次签名都会需要它
//设置package订单参数
SetParameter("appid", appid);
//公众账号ID
SetParameter("body", "gtsw-wxpaytest"); //商品描述
SetParameter("mch_id", mchid);
SetParameter("nonce_str", wxhand.GenerateCheckCode(16).ToLower());
//随机字符串
SetParameter("notify_url", "http://***/wxpay/paycallback.aspx");
//接收财付通通知的URL
SetParameter("openid", openid);
SetParameter("out_trade_no", wxhand.ConvertDateTimeInt(DateTime.Now) + wxhand.GenerateCheckCode(8));
//商家订单号
SetParameter("spbill_create_ip", sIp);
//用户的公网ip,不是商户服务器IP
SetParameter("total_fee", "1");
//商品金额,以分为单位(money * 100).ToString()
SetParameter("trade_type", "JSAPI");
//交易类型
//签名,需要除sin以外所有的参数都得参与签名
string sign = wxhand.getSin(Parameters, appkey);
SetParameter("sign", sign);//签名
string pkxml = wxhand.getDataXML(Parameters);
//发送给微信支付统一下单接口
string urlFormat = "https://api.mch./pay/unifiedorder";
var result = wxhand.GetPage(urlFormat, pkxml);
//接收微信返回的xml数据
var res = XDocument.Parse(result);
openid可以通过网页授权得到&传送门& ,这里我们只需要得到一个OPENID,所以授权类型为&scope=snsapi_base静默授权就好了。
setParameter方法是给Hash包里添加参数:
/// &summary&
/// 设置发送数据包参数值
/// &/summary&
/// &param name="parameter"&&/param&
/// &param name="parameterValue"&&/param&
public void SetParameter(string parameter, string parameterValue)
&span& &/span&
if (parameter != null && parameter != "")
if (Parameters.Contains(parameter))
Parameters.Remove(parameter);
&/span&Parameters.Add(parameter, parameterValue);
sign是获取prepay_id的签名,参与签名的参数是:除了sign以外的所有参数。(!!!!!!!!MD5加密的结果要大写啊!!!!!!)
appkey是拼接在字符串的最后面 &key=appkey
/// &summary&
/// 获取签名
/// &/summary&
/// &returns&sin签名&/returns&
public string getSin(Hashtable ParametersTosin,string appkey)
StringBuilder sb = new StringBuilder();
ArrayList akeys = new ArrayList(ParametersTosin.Keys);
akeys.Sort();
foreach (string k in akeys)
string v = (string)ParametersTosin[k];
if (null != v && "".CompareTo(v) != 0 && "sign".CompareTo(k) != 0 && "key".CompareTo(k) != 0)
sb.Append(k + "=" + v + "&");
sb.Append("key=" + appkey);
string sign = MD5(sb.ToString()).ToUpper();
好的,如果你按照上面来的话,应该是无误的啦,那么把数据包发送给统一下单的接口之后,会收到返回的xml数据包
拿到最重要的prepay_id了,最后的支付签名需要用到它。
if (res.Element("xml").Element("return_code").Value == "SUCCESS")
//下单成功返回
string repayId = res.Element("xml").Element("prepay_id").V
wxpayconfig = new wxHandleModel.wxPayconfig();
wxpayconfig = wxhand.GetwxPay(repayId);
//下单失败返回
wxpayconfig = new wxHandleModel.wxPayconfig();
if (res.Element("xml").Element("return_msg").Value.Contains("openid"))
//如果错误信息为无效的openid,跳转到授权页面重新授权。
Response.Redirect("https://open./connect/oauth2/authorize?appid=wxc94d5d50202f9dcf&redirect_uri=" + oauthurl + "&response_type=code&scope=&spanHelvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, 黑体, Arial, sans- font-size: 14 line-height: 22.3"&snsapi_base&/span&&state=1#wechat_redirect");
//下单错误信息。
Response.Write("return_code:" + res.Element("xml").Element("return_code").Value + ",return_msg:" + res.Element("xml").Element("return_msg").Value);
最后就是要获取微信支付JS中需要的参数了 在&GetwxPay 方法中
/// &summary&
/// 获取微信支付JS包
/// &/summary&
/// &param name="repayId"&预支付ID&/param&
/// &returns&&/returns&
public wxHandleModel.wxPayconfig GetwxPay(string repayId)
wxHandleModel.wxPayconfig wxpayconfig = new wxHandleModel.wxPayconfig();
string package = string.Format("prepay_id={0}", repayId);
//package包
wxpayconfig.package =
wxpayconfig.timestamp = ConvertDateTimeInt(DateTime.Now);
string nostr = GenerateCheckCode(16);
wxpayconfig.nonceStr =
wxpayconfig.signType = "MD5";
//加密方式
string stringA = string.Format(@"appId={0}&nonceStr={1}&package={2}&signType={3}&timeStamp={4}&key={5}"
, appid, wxpayconfig.nonceStr, wxpayconfig.package, wxpayconfig.signType, wxpayconfig.timestamp, appkey);
wxpayconfig.paySign = MD5(stringA).ToUpper();
//微信支付签名
这是最后一步了,也是最终要的一步,随机串和时间戳没什么说的
package 一定要是package=‘wx12212vghdsad’ 这样的形式 , appkey密匙拼接在加密的字符串最后中
参与签名的参数大小写一定要注意,appId &不要写成 appid ,大小写加密出来的字符不同 &最后转大写。
还记得请求参数里的回调URLnotify_url 吗,这个也非常重要,
他说:支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
所以 &这是&paycallback.aspx 内的代码
string postStr = "";
/// &summary&
/// 微信支付回调
/// &/summary&
/// &param name="xml"&&/param&
if (Request.HttpMethod.ToLower() == "post")
Stream s = System.Web.HttpContext.Current.Request.InputS
byte[] b = new byte[s.Length];
s.Read(b, 0, (int)s.Length);
postStr = Encoding.UTF8.GetString(b);
if (!string.IsNullOrEmpty(postStr))
//封装请求类
var res = XDocument.Parse(postStr);
if (res.Element("xml").Element("return_code").Value == "SUCCESS")
WriteTxt(string.Format(@"商户订单号:{0},订单状态:{1},金额:{2},时间:{3},openid:{4}",
res.Element("xml").Element("out_trade_no").Value,
res.Element("xml").Element("result_code").Value,
res.Element("xml").Element("total_fee").Value,
res.Element("xml").Element("time_end").Value,
res.Element("xml").Element("openid").Value
//保存订单信息,并返回微信应答
Response.Write(string.Format(@"&xml&
&return_code&&![CDATA[SUCCESS]]&&/return_code&
&return_msg&&![CDATA[OK]]&&/return_msg&
&/xml&"));
WriteTxt(res.ToString());
Response.Write(string.Format(@"&xml&
&return_code&&![CDATA[{0}]]&&/return_code&
&return_msg&&![CDATA[{1}]]&&/return_msg&
&/xml&", "FAIL", res.Element("xml").Element("return_msg").Value));
因为是测试,我就把信息保存在了 记事本里,方便查看,一开始我只是接收了微信通知的信息,但是我没有回应 然后记事本里就会增加好多条同一个订单的信息
所以一定要回应微信,一定要以上面代码中 xml的形式,回复之后 你会收到微信支付公众号给你推送的一条消费消息。
延伸阅读:&&&&&&&&&&&&
以上就介绍了微信支付JS-SDK最新版,从0开始,包括了方面的内容,希望对.NET教程有兴趣的朋友有所帮助。
本文网址链接:/article/detail_110613.html
上一篇: 下一篇:}

我要回帖

更多关于 微信中使用支付宝 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信