微信支付接口中为什么demo中提供的jsiframe调用父窗口js不到支付界面

坑爹的微信支付v3,其实没有那么坑 - 推酷
坑爹的微信支付v3,其实没有那么坑
研究微信开发一年多了,每个新接口,都会第一时间进行研究。微信支付开放很久,一直没机会接触到支付接口,等了好久终于从朋友那儿搞到了接口,从此开始了我两天多的支付接口的研究。
拿到这个接口文档的第一个想法就是这也没什么难的嘛, 和支付宝、财付通、网银在线等一些传统接口的思路逻辑都是一样的,觉得差不多最多一个下午就可以搞定,结果第一步调用统一支付接口就给来了个下马威,不管怎么改,就一直返回签名错误。第一次遇到签名错误,首先想到的是应该是没有正确理解签名的生成规则,又从头看了几次签名的生成规则,每次都是的理解都是一样的,试了改几次还是不行。 这一次已经开始怀疑腾讯的文档写的有问题,一边找其他资料一边在心里骂腾讯写文档的作者。在园子里看到了
后,更加确认是微信的文档的问题。现在想想当时的想法太幼稚了,大部分自信心爆棚的人,在遇到解决不了的问题时总是会怀疑是不是别人给的东西不对,而不会从自身找问题,一句话总结就是 一到便秘就怪地球没引力 。(各位看官请勿对号入座,纯属个人见解,勿喷)。
现在说正题。。
从开始遇到错误到最后解决签名的问题,总结的问题就是我在生成签名的时候把参数进行了编码,而官方给的开发文档并没有说要做url编码,另外一个就是我进入了一个死胡同,总觉得自己的理解与实现过程没有问题,但最后当我把之前写的代码完全放弃,推倒重做后,问题终于解决。兴奋之极。下面从头说下我的理解与解决方法。
官方文档中接口调用规则:
?& 认证方式:HTTPS 认证,退款和冲正接口调用需要商户证书(证书在审核邮件附件
?& 请求采用 POST 方式
?& 提交和返回结果采用 XML 格式
?& 字符集默认使用 UTF-8,请勿使用其它字符集
?& 商户与微信之间的交互(特别是 Native 回调和支付通知回调),都需要验证签名
?& 处理返回时先判断协议返回错误码,再判断业务返回错误码,最后判断交易状态
下面是官方的签名生成方法
a.对所有传入参数按照字段名的 ASCII 码 从小到大排序(字典序) 后,使用 URL 键值对的格式(即 key1=value1&key2=value2…)拼接成字符串 string1, 注意: 值为空的参数不参与签名 ;
b. 在 string1 最 后 拼 接 上 key=Key( 商 户 支 付 密 钥 ) 得 到 stringSignTemp 字 符 串 , 并 对 stringSignTemp 进行 md5 运算,再将得到的字符串所有字符转换为大写,得到 sign 值
下面是我所理解的签名生成规则:
1,所有的参数都是小写的
2,参数的值不需要做任何处理,包括url编码
3,确保必须的参数不能为空,且是正确无误的。
下面是示范过程:
要传入的参数分别为:appid, mch_id, nonce_str, body, attach, out_trade_no, total_fee, spbill_create_ip, notify_url, trade_type, openid(jsapi必须)& , product_id(native必须) 。
首先将键值对存入&Dictionary&string,string&中,其次根据key值升序排序,代码如下:& & var dictemp = dic.OrderBy(d =& d.Key);
然后将键值对转换成url形式后,在末尾链接上key值,例如:appid=****&attach=****…………&key=******,最后进行md5加密并将加密后的字符串转换成大写。这里需要特别注意的是,md5加密是需要将字符集转换成utf-8,否则中文商品描述会出现乱码。
public static string MD5(string pwd)
MD5 md5 = new MD5CryptoServiceProvider();
byte[] data = System.Text.Encoding.UTF8.GetBytes(pwd);
byte[] md5data = puteHash(data);
md5.Clear();
string str = &&;
for (int i = 0; i & md5data.L i++)
str += md5data[i].ToString(&x&).PadLeft(2, '0');
生成签名后将sign=签名 &键值对添加到生成签名时生成的dictemp中,然后将dictemp转换成xml,post到
,返回值也是xml,最后对xml进行解析,为了保证安全性,需将解析后的键值对进行签名校验。
1 &xml&&appid&&![CDATA[******]]&&/appid&&mch_id&&![CDATA[******]]&&/mch_id&&nonce_str&&![CDATA[b48cfbebd4c9df66f0e47]]&&/nonce_str&&body&&![CDATA[神六]]&&/body&&out_trade_no&&![CDATA[ggggg673526]]&&/out_trade_no&&total_fee&&![CDATA[1000000]]&&/total_fee&&spbill_create_ip&&![CDATA[59.174.203.41]]&&/spbill_create_ip&&notify_url&&![CDATA[http://wxpay.ttyouni.net/aspx/order/notify.aspx]]&&/notify_url&&trade_type&&![CDATA[JSAPI]]&&/trade_type&&openid&&![CDATA[ozJkDj6yXuUsxIgS4xiJbtZMv2XQ]]&&/openid&&sign&&![CDATA[7CBA5A6BFF210BDA8C1AA33E9D803711]]&&/sign&&/xml&
校验签名无误后,下一步就是取出预支付id prepay_id,然后调用微信支付js,注意:调用微信支付js之前也需要将所有参与调用的参数进行签名,且这里的参与签名的参数需要验证遵守大小写(腾讯有的时候真的很脑残,一会全小写,一会有大写有小写)。生成签名后就可以调用微信支付js了,代码如下:
1 var WxPay= {
Pay: function (appId, timeStamp, nonceStr, package, signType, paySign,callback) {
WeixinJSBridge.invoke('getBrandWCPayRequest', {
&appId&: appId,
//公众号名称,由商户传入
&timeStamp&:timeStamp,
//时间戳,自 1970 年以来的秒数
&nonceStr&: nonceStr, //随机串
&package&: package,
&signType&: signType,
//微信签名方式
&paySign&: paySign //微信签名
}, function (res) {
if (res.err_msg == &get_brand_wcpay_request:ok&) {
callback();
// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg 将在用户支付成功后返回 ok,但并不保证它绝对可靠。
微信支付js
为了方便调用,我将微信支付js写到了一个单独的js文件,然后在页面中载入,生成签名用ajax调用。调用代码如下:
1 &script&
$(function () {
$(&#submit&).click(function () {
$.get(&WxPay.ashx?action=jspayparam&, {
body: $(&#body&).val(),
total_fee: $(&#price&).val(),
out_trade_no: $(&#order&).val(),
trade_type: &JSAPI&,
msgid:&&%=openid%&&
}, function (data) {
WxPay.Pay(data.appId, data.timeStamp, data.nonceStr, data.package, data.signType, data.paySign, function () {
alert(&支付成功&);
}, &json&);
支付js调用
这里我只传入了一些和商品相关的参数,其他和商品无法的参数写到了后台代码中。后台收到请求后,将appid,mch_id等参数拼接成键值对进行进一步的处理,然后将处理后的结果返回给前台。
void GetJsPayParam(HttpContext context)
JsEntities jsEntities = new JsEntities()
appId = appid,
nonceStr = WxPayHelper.Utils.GetRandom(),
package = string.Format(&prepay_id={0}&, GetPrepayId(context)),
signType = &MD5&,
timeStamp = WxPayHelper.Utils.ConvertDateTimeInt(DateTime.Now).ToString()
string url,
WxPayHelper.Utils.GetUnifyUrlXml&JsEntities&(jsEntities, key, out url, out sign);
jsEntities.paySign =
context.Response.Write(JsonConvert.SerializeObject(jsEntities));
获取js支付参数
下面是生成键值对的方法,由于请求支付的过程中,到处需要生成签名,所以我将各个请求参数都写成了一个个类,然后使用泛型类和反射动态生成字典键值对,请求url和xml。代码如下:
public static string GetUnifyUrlXml&T&(T t,string key,out string url,out string _sign)
Type type = typeof (T);
Dictionary&string,string& dic = new Dictionary&string, string&();
PropertyInfo[] pis = type.GetProperties();
#region 组合url参数到字典里
foreach (PropertyInfo pi in pis)
object val = pi.GetValue(t, null);
if (val != null)
dic.Add(pi.Name, val.ToString());
#endregion
//字典排序
var dictemp = dic.OrderBy(d =& d.Key);
#region 生成url字符串
StringBuilder str = new StringBuilder();
foreach (var item in dictemp)
str.AppendFormat(&{0}={1}&&, item.Key, item.Value);
#endregion
var ourl= str.ToString().Trim('&');
string tempsign = ourl + &&key=&+
//md5加密后,转换成大写
string sign = MD5(tempsign).ToUpper();
//将签名添加到字典中
dic.Add(&sign&, sign);
url = str.AppendFormat(&sign={0}&,sign).ToString();
//生成请求的内容,并返回
return parseXML(dic);
生成键值对,url,xml
到这里应该就可以满足jsapi的需求了, 后期会将native和其他接口分享给大家。
如果你觉得本人对你有帮助,请大方的扫下面的二维码悬赏一下吧。
新建了个微信支付及微信开发的QQ群,欢迎大家加入一起交流微信开发技术。
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见热门搜索:         
php微信支付接口开发程序(流程已通)
来源:未知
时间: 17:11
作者:xxadmin
[导读] 微信支付接口现在也慢慢的像支付宝一个可以利用api接口来实现第三方网站或应用进行支付了,下文整理了一个php微信支付接口开发程序并且己测试,有兴趣的朋友可进入参考。 必要条...
微信支付接口现在也慢慢的像支付宝一个可以利用api接口来实现第三方网站或应用进行支付了,下文整理了一个php微信支付接口开发程序并且己测试,有兴趣的朋友可进入参考。
必要条件:
appid //公众号后台开发者中心获得(和邮件内的一样)&& mchid//邮件内获得& key//商户后台自己设置& appsecret //公众号开发者中心获得
两个证书文件,邮件内获得 apiclient_cert.pem&& apiclient_key.pem
注意事项:
公众号后台微信支付-》开发配置-》新增测试目录和测试个人微信号。
开发者中心-》网页授权获取用户基本信息-》修改成你的测试域名。否则会出现redirect_uri 参数错误
&&&&&&&&&&后续待完善&&&&&&-
微信支付就绪页面后台自行了三次操作:
1.获取openid
//使用jsapi接口
&& $jsApi = new JsApi_pub();
&&& //=========步骤1:网页授权获取用户openid============
&&& //通过code获得openid
&&& if (!isset($_GET['code']))
&&&&&&& //触发微信返回code码
&&&&&&& $url = $jsApi-&createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);
&&&&&&& //echo $
&&&&&&& Header(&Location: $url&);
&&&&&&& //获取code码,以获取openid
&&&&&&& $code = $_GET['code'];
&&&&&&& $jsApi-&setCode($code);
&&&&&&& $openid = $jsApi-&getOpenid();
刚开始的时候第一步也遇到问题,没饭获得openid这个和部分服务器有关,demo内用的是curl获取的方式。奇怪我的服务器curl一直无法获取到。后来改成file_get_contents可以正常获取了。可这并不是解决之道。因为后面还需要用到更多的curl操作。看到开发文档里面有一个地方写证书操作需要libcurl 7.20.1以上版本,然后我就一直在整服务器想把linux的php curl版本提高。最后面我是换到了另外一台windows服务器就好了。先暂时这样吧,下次需要用的时候再调试。
第二步:获取与支付订单号id
$unifiedOrder = new UnifiedOrder_pub();
&&& //var_dump($unifiedOrder);
&&& //设置统一支付接口参数
&&& //设置必填参数
&&& //appid已填,商户无需重复填写
&&& //mch_id已填,商户无需重复填写
&&& //noncestr已填,商户无需重复填写
&&& //spbill_create_ip已填,商户无需重复填写
&&& //sign已填,商户无需重复填写
&&& $unifiedOrder-&setParameter(&openid&,&$openid&);//商品描述
&&& $unifiedOrder-&setParameter(&body&,&贡献一分钱&);//商品描述
&&& //自定义订单号,此处仅作举例
&&& $timeStamp = time();
&&& $out_trade_no = WxPayConf_pub::APPID.&$timeStamp&;
&&& $unifiedOrder-&setParameter(&out_trade_no&,&$out_trade_no&);//商户订单号&
&&& $unifiedOrder-&setParameter(&total_fee&,&1&);//总金额
&&& $unifiedOrder-&setParameter(&notify_url&,WxPayConf_pub::NOTIFY_URL);//通知地址&
&&& $unifiedOrder-&setParameter(&trade_type&,&JSAPI&);//交易类型
&&& //非必填参数,商户可根据实际情况选填
&&& //$unifiedOrder-&setParameter(&sub_mch_id&,&XXXX&);//子商户号&&
&&& //$unifiedOrder-&setParameter(&device_info&,&XXXX&);//设备号&
&&& //$unifiedOrder-&setParameter(&attach&,&XXXX&);//附加数据&
&&& //$unifiedOrder-&setParameter(&time_start&,&XXXX&);//交易起始时间
&&& //$unifiedOrder-&setParameter(&time_expire&,&XXXX&);//交易结束时间&
&&& //$unifiedOrder-&setParameter(&goods_tag&,&XXXX&);//商品标记&
&&& //$unifiedOrder-&setParameter(&openid&,&XXXX&);//用户标识
&&& //$unifiedOrder-&setParameter(&product_id&,&XXXX&);//商品ID
&&& $prepay_id = $unifiedOrder-&getPrepayId();
&&& //echo 'prepay_id:';
&&& var_dump($prepay_id);
这一步也遇到非常多的问题。
首先微信支付测试比较困难,只有在微信内才可以测试。我就用手机刷来刷去。其次使用var_dump调试也不好使额。打印一些 xml格式的文件只显示字符长度,不显示内容。于是用log的形式写在服务器上调试,log代码:
// 打印log
&&& function& log_d($word)&
&&&&&&& $log_name=&./logd.log&;//log文件路径
&&&&&&& $fp =&fopen($log_name,&a&);
&&&&&&& flock($fp, LOCK_EX) ;
&&&&&&& fwrite($fp,&执行日期:&.strftime(&%Y-%m-%d-%H:%M:%S&,time()).&n&.$word.&nn&);
&&&&&&& flock($fp, LOCK_UN);
&&&&&&& fclose($fp);
在demo里面的 WxPayPubHelper.php 里面 用 $this-&log_d(xxx);调用。
刚开始的时候由于给我的mchid和 appid不匹配一直报错。。是他们给错我账号了。刚开始我也不懂乱试。这一步的调试在 getPrepayId()内 var_dump($this-&result); 就能看到错误代码。
第三步:生成支付前端 js代码就绪到网页上:
$jsApi-&setPrepayId($prepay_id);
&&& $jsApiParameters = $jsApi-&getParameters();
&&&&&&&-点击前往支付&&&&&&&&-
这部分又遇到了问题:
android返回&System:Access_denied&,ios返回&access_control:not_allowed&
搜了很多百度。其实早就看到了这个东西一直没注意!
发起授权请求的页面必须是在授权目录下的页面,而不能是存在与子目录中。否则会返回错误
支付文件我放在了/域名/pay/demo/
刚开始的时候我一直是到/域名/pay/结尾以为就可以了。支持子目录,结果是不行的!。
&&&&&&&&&最后看下图&&&&&
&&&&&&流程中的xmljs&&&&&&&
待提交生成与支付订单id:
& &openid&&![CDATA[ou9dHt0L8qFLI1foP-kj5x1mDWsM]]&&/openid&
& &body&&![CDATA[贡献一下]]&&/body&
& &out_trade_no&&![CDATA[wx79]]&&/out_trade_no&
& &total_fee&1&/total_fee&
& &notify_url&&![CDATA[http://shanmao.me/wxpay/notify_url.php]]&&/notify_url&
& &trade_type&&![CDATA[JSAPI]]&&/trade_type&
& &appid&&![CDATA[wx8888]]&&/appid&
& &mch_id&&/mch_id&
& &spbill_create_ip&&![CDATA[61.50.221.43]]&&/spbill_create_ip&
& &nonce_str&&![CDATA[60uf9sh6nmppr9azveb2bn7arhy79izk]]&&/nonce_str&
& &sign&&![CDATA[2D8ABBA23D0F]]&&/sign&
提交后返回正确,其中包含了perpay_id:
& &return_code&&![CDATA[SUCCESS]]&&/return_code&&&
& &return_msg&&![CDATA[OK]]&&/return_msg&&&
& &appid&&![CDATA[wx8888]]&&/appid&&&
& &mch_id&&![CDATA[]]&&/mch_id&&&
& &nonce_str&&![CDATA[Be8YX7gjCdtCT7cr]]&&/nonce_str&&&
& &sign&&![CDATA[885B6D8EF753A00C8EEDB]]&&/sign&&&
& &result_code&&![CDATA[SUCCESS]]&&/result_code&&&
& &prepay_id&&![CDATA[wx]]&&/prepay_id&&&
& &trade_type&&![CDATA[JSAPI]]&&/trade_type&&
生成支付用的js :
&&& &appId&: &wx8888&,
&&& &timeStamp&: &&,
&&& &nonceStr&: &gbwr71b5no6q6ne18c8up1u7l7he2y75&,
&&& &package&: &prepay_id=wx&,
&&& &signType&: &MD5&,
&&& &paySign&: &9CF851EBF6C7D&
支付成功后返回的通知xml:
&xml&&appid&&![CDATA[wx]]&&/appid&
&bank_type&&![CDATA[CCB_DEBIT]]&&/bank_type&
&fee_type&&![CDATA[CNY]]&&/fee_type&
&is_subscribe&&![CDATA[Y]]&&/is_subscribe&
&mch_id&&![CDATA[1011111]]&&/mch_id&
&nonce_str&&![CDATA[38gt0ffgsvfsdfsdfbt1981duv63p7]]&&/nonce_str&
&openid&&![CDATA[o4p3SjfdsfdsfdsdCE5Y2XHw4]]&&/openid&
&out_trade_no&&![CDATA[wx4b56d1fsdfdsf]]&&/out_trade_no&
&result_code&&![CDATA[SUCCESS]]&&/result_code&
&return_code&&![CDATA[SUCCESS]]&&/return_code&
&sign&&![CDATA[356EfsdfdsfsdsfE69509EDA344]]&&/sign&
&sub_mch_id&&![CDATA[]]&&/sub_mch_id&
&time_end&&![CDATA[22]]&&/time_end&
&total_fee&1&/total_fee&
&trade_type&&![CDATA[JSAPI]]&&/trade_type&
&transaction_id&&![CDATA[fsdfsd4]]&&/transaction_id&
这其中的数据我随意了的,大家就参考下格式吧。注意大小写敏感。
上一篇: 下一篇:
更多文章推荐
<span style="display: padding-left:5 font-size:12 color:#FF
<span style="display: padding-left:5 font-size:12 color:#FF
<span style="display: padding-left:5 font-size:12 color:#FF
<span style="display: padding-left:5 font-size:12 color:#FF
<span style="display: padding-left:5 font-size:12 color:#FF
<span style="display: padding-left:5 font-size:12 color:#FF
<span style="display: padding-left:5 font-size:12 color:#FF
<span style="display: padding-left:5 font-size:12 color:#FF
MySql常用命令大全</... <span style="display: padding-left:5 font-size:12 color:#FF
<span style="display: padding-left:5 font-size:12 color:#FF
栏目列表一览
通过网站功能来增加一字段,获取来源关键字,如何获取来源关键字...
--进入正题首先,在模块里安装手机wap浏览,如果本地没有也可以从网...
当你安装完Linux系统,并且已经启动,恭喜你!如果你的硬盘上还安装...
我的版本是dedecms5.7、UTF8的,默认的网站模板显示非常不适合做优化...
在 PHP 中,提供了超过 700 个内建的函数。 PHP 的函数分为用户自定义...【微信支付】公众号支付接口文档V2.7_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
【微信支付】公众号支付接口文档V2.7
【&#8203;微&#8203;信&#8203;支&#8203;付&#8203;】&#8203;公&#8203;众&#8203;号&#8203;支&#8203;付&#8203;接&#8203;口&#8203;文&#8203;档&#8203;V&#03;.&#8203;7
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢js api 接口文档及例子demo - 下载频道
- CSDN.NET
&&&&微信支付
js api 接口文档及例子demo
js api 接口文档及例子demo
开发微信使用的 微信支付的接口, 在公众帐号上跳转到的 html页面上,使用js进行支付,里面有 java php asp c# 的例子
若举报审核通过,可奖励20下载分
被举报人:
wangshixiu86
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
开发技术下载排行

我要回帖

更多关于 js调用android的方法 的文章

 

随机推荐