微信扫一扫支付怎么弄支付问题

3. 要你命3000 ——
微信支付开发系列问题解决
为什么要开发微信和微信开发的优势我就不用多说了吧。微信支付的方式分好几种:
1.扫码支付
2.公众号支付
不管是那种支付方式,都要用到统一下单这个接口,而一般大多数人都会卡在预支付id没有拿到这一步,今天就主要分析预支付id的获取和问题解决
开发前准备
一个开通了微信支付的公众号
确保将安全授权目录配置好了
支付回调地址配置好了
如果不知道怎么配置,请看
步骤一:发起支付准备
生成商户订单
先要根据自己的业务逻辑生成自己可读的商户订单号,一般推荐年月日+随机数+用户uid
$order_no = date('YmdHis').rand(1000,9999).$uid;
使用同一下单接口下单
使用微信统一下单接口,获得微信的预支付信息,对于统一下单接口的详细信息可以看
我们先实例化微信统一下单接口的类,这个类在里有,当然在这里我将微信demo类库再次封装加入命名空间更好的适应Thinkphp。
UnifiedOrder_pub类:
namespace Org\Weixinpay;
use Org\Weixinpay\Wxpay_client_pub;
use Org\Weixinpay\WxPayConf_pub;
use Org\Weixinpay\SDKRuntimeException;
class UnifiedOrder_pub extends Wxpay_client_pub
function __construct($appid,$mchid,$key,$appsecret)
Common_util_pub::__construct($appid,$mchid,$key,$appsecret);
$this-&url = "https://api.mch./pay/unifiedorder";
$this-&curl_timeout = 60;
function createXml()
if($this-&parameters["out_trade_no"] == null)
throw new SDKRuntimeException("缺少统一支付接口必填参数out_trade_no!"."&br&");
}elseif($this-&parameters["body"] == null){
throw new SDKRuntimeException("缺少统一支付接口必填参数body!"."&br&");
}elseif ($this-&parameters["total_fee"] == null ) {
throw new SDKRuntimeException("缺少统一支付接口必填参数total_fee!"."&br&");
}elseif ($this-&parameters["notify_url"] == null) {
throw new SDKRuntimeException("缺少统一支付接口必填参数notify_url!"."&br&");
}elseif ($this-&parameters["trade_type"] == null) {
throw new SDKRuntimeException("缺少统一支付接口必填参数trade_type!"."&br&");
}elseif ($this-&parameters["trade_type"] == "JSAPI" &&
$this-&parameters["openid"] == NULL){
throw new SDKRuntimeException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"."&br&");
$this-&parameters["appid"] = $this-&
$this-&parameters["mch_id"] = $this-&
$this-&parameters["spbill_create_ip"] = get_client_ip();
$this-&parameters["nonce_str"] = $this-&createNoncestr();
$this-&parameters["sign"] = $this-&getSign($this-&parameters);
$this-&arrayToXml($this-&parameters);
}catch (SDKRuntimeException $e)
return array('return_code'=&'FAIL','return_msg'=&$e-&errorMessage());
function getPrepayId()
$this-&postXml();
$this-&result = $this-&xmlToArray($this-&response);
return $this-&
我们实例化UnifiedOrder_pub,并依此传入参数,$appid,$mchid,$key,$appsecret
$unifiedOrder = new UnifiedOrder_pub($this-&config['pay_weixin_appid'],$this-&config['pay_weixin_mchid'],$this-&config['pay_weixin_key'],$this-&config['pay_weixin_appsecret']);
waring:在第一步里面会出的错误就是你的四个参数没有按顺序给对,记住这里面的参数一定要按顺序给,并且你要检查你的四个参数是否是有效的没有过期
在第一步出错的同学都不能吊起微信支付的样式,即下图:
但是如果你写入了调试js的话可以看见具体错误,这里就不提调试js了。
第二步:向统一下单接口中添加所需参数
$unifiedOrder-&setParameter("openid",$this-&user_info['openid']);//用户微信唯一标识
$unifiedOrder-&setParameter("body",$this-&order_info['order_name']);//商品描述
$unifiedOrder-&setParameter("out_trade_no",$order_no);//商户订单号
$unifiedOrder-&setParameter("total_fee",floatval($pay_money*100));//总金额
$unifiedOrder-&setParameter("notify_url",$notice_url);//通知地址
$unifiedOrder-&setParameter("trade_type","JSAPI");//交易类型
warning: 在第二步中,尤其要注意的就这个通知地址的格式,通知地址一定不能带任何参数的地址,包括你是pathinfo模式也好,只能以/index.php这种模式结尾。
/index.php?a=index,/index.php/admin/index 这样的写法全部是错的。
第三步:获取预支付信息
将上述内容提交给接口,正确可返回预支付ID
$prepay_result = $unifiedOrder-&getPrepayId();
如果错误,我们可以打印来查看是什么错误
var_dump($prepay_result);
$prepay_result['return_code'] == 'FAIL'
$prepay_result['return_msg']
当我们已经拿到预支付ID的时候,那么支付准备已经完成
调起JSAPI支付
第一步:在前台文件中我们使用注册支付JSAPI
function onBridgeReady(msg_json){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":msg_json.appId,
"timeStamp":msg_json.timeStamp,
"nonceStr":msg_json.nonceStr,
"package":msg_json.package,
"signType":msg_json.signType,
"paySign":msg_json.paySign
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
check_pay_is_ture_ok();
第二步:支付js准备绑定事件(这里就举例按钮)
$('#button_pay_now').on('click',function(){
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
onBridgeReady(msg_json);
到这里我们就可以看到调起微信支付的JS效果了
报错信息分析
微信坑就在你很好的完成以上步骤也不能支付,总会报错,在这里我就把我曾经遇到的错误写下来,与大家一起探讨
1.缺少统一支付接口必填参数total_fee!
这个错造成的原因:
q:你没有传递参数total_fee
a:检查是否传递参数,最好一步步打印到日志中查看
q:total_fee 参数格式错误
a:参数的单位是分,也就是一元钱的话就是100,所以建议最后处理的时候都要处理为分,建议最后用floatval处理下
2.缺少统一支付接口必填参数notify_url!
这个错造成的原因:
q:你没有传递参数notify_url
a:检查是否传递参数,最好一步步打印到日志中查看
q:notify_url 参数格式错误
a:通知地址一定不能带任何参数的地址,包括你是pathinfo模式也好,只能以/index.php这种模式结尾
3.签名错误
这个错造成的原因:
1.你的四个参数的错误,尤其注意key这个参数,如果你的key是大小写混合的话,一定要在签名前把其转化为统一的大写形式
2.签名中的APPID 和appsecret
appid和商户号
3.过期的key,可以支付的公众号可是要一年过期一次,相应的key每年都会有变化。
本文已收录于以下专栏:
相关文章推荐
这段时间在做微信支付开发,在公司的公众号审批下来后,我这边的测试用例也已经开发完毕,于是拿着具体的数据来调试了,大段大段的代码就不贴了,demo里有,这里就说说调试过程中遇到的坑。...
微信支付的那些坑!
标签:wxpay, 微信支付
最近在研究微信支付,感觉在微信里面买东西,直接微信支付还是蛮方便的,没有支付宝那么麻烦,刷刷朋友圈,顺便就买点东西,生活是如此的惬意,心想...
最近更换服务器之后,加上了nginx做代理并做了负载均衡后,微信支付第一次支付缺少参数 total_fee,再支付就可以,再点支付有报错缺少参数 total_fee,好奇怪,按理说是不应该报错或者要就...
在做微信支付的时候,使用的是easyWecha框架,https://easywechat.org/zh-cn/docs/payment.html
生成js代码调用微信发起支付的时候遇到【缺少参数 to...
微信小程序 调用支付jsapi时缺少参数:total_fee
下面是 官方给的 帮助文档。
支付返回签名错误
注意签名参数的大小写,支付密钥key要到商户平台设置,设置的规则是32位数字与字母大小写的组合。以下链接为签名过程。
这段时间在做微信支付开发,在公司的公众号审批下来后,我这边的测试用例也已经开发完毕,于是拿着具体的数据来调试了,大段大段的代码就不贴了,demo里有,这里就说说调试过程中遇到的坑。
解决微信网页支付的接口用户自定义商品参数传递问题
最近客户有个需求:客户使用微信完成付款后会自动关注微信支付账号绑定的微信公众号这样的场景客户体验不好,提出就只想能使用微信支付功能不要自动关注公众号。
所以就有了以下解决方案;
一、在原有的公众号...
运行微信支付测试代码https://pay./wiki/doc/api/jsapi.php?chapter=11_1(我下载的是PHP)
发现demo里有几处需要修改的。
他的最新文章
讲师:李江龙
讲师:司徒正美
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Android(1)
开发步骤:
1、到微信开放平台,登记开发应用提交相应的材料(1、提交的图片有28*28px
png 大小不超过300kb的应用图标 2、高清应用图标108*108px png格式 大小不超过300kb的应用图标),将该应用提交审核,审核大约是一天左右。还要给你的应用做签名,&运行到手机上对你的qpp进行应用签名,也就是让微信认识这个app。微信支付还要另外在审核提交的材料其中有图片(商品详情图片,版权图片,支付图片相应的规格参考微信平台)这个审核估计得两三天。
2、下载微信开发工具包集成到开发环境:&这个包最好是最新版的,因为之后的签名版本之间存在差别,(注意如果有做混淆代码在混淆文件中加入下面配置)
-keep&class&com.tencent.mm.sdk.**&{&*;}
3、使用开发工具进行调起微信登陆或微信支付首先要注册IWXAPI&
// IWXAPI 是第三方app和微信通信的openapi接口
private IWXAPI api;
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api= WXAPIFactory.createWXAPI(this, Constants.APP_ID);
api.registerApp(Constants.APP_ID);
&微信登陆时直接
api.handleIntent(getIntent(), this);实现IWXAPIEventHandler回调
微信支付是:
PayReq request = new PayReq();
WXCreateOrder.BodyEntity body = result.getBody();
request.appId = body.getAppid();
request.partnerId=body.getPartnerid();
request.prepayId= body.getPrepayid();
request.packageValue = body.getPackageX();
request.nonceStr=body.getNoncestr();
request.timeStamp=body.getTimestamp();
request.sign=body.getPaySign();
&直接调起支付连链接地址都不用你管这里面7个参数分别是应用id,合作商户id,预支付id,扩展字段,随机字符串,时间戳,签名。
前6个参数通常不会有问题,第七个参数是最容易出现问题,它签名规则是1.参数名按ASCII码顺序排列拼接商户key值 2.区分大小写。
app调起微信支付的时候是只要返回错误信息,也没有打log,所以是很难判断你是哪里出错,而且测试时用的debug.keystore 和打包后的keystore不一样。
所以相当于你每测试一次就打包一次及其麻烦。印象中是可以配置,所以抱着试试看到想法到网上查了相关资料发现是可以在build.gradle里进行配置配置如下:
signingConfigs{
releaseConfigs{
storeFile file(&/awork/workpace/user/kestory.jks&)
storePassword &hlj66&
&keyAlias &hlj&
&keyPassword &&
debugConfigs{
storeFile file(&/awork/workpace/user/kestory.jks&)
storePassword &&
&keyAlias &hlj&
&keyPassword &&
buildTypes {
signingConfig signingConfigs.debugConfigs
buildConfigField &boolean&, &ISDEBUG&, &true&
}这样你的测试环境和正式打包的应用签名是一致的,也就是前面所说的微信才会认识这个app,这是一个坑
遇到的一些问题:
1、当初应用签名,后来忘记签名的密码,所以我重新修改了开放平台上的应用签名,重新测试发现连微信登陆都调不起,我后来查找了相关资料发现,当你使用微信登陆或分享的时候,微信的客户端会存储你的app在微信开放平台上配置的包名跟应用签名,如果你在自己的应用里面第一次使用微信登陆或分享后,你的应用相关的信息就会被微信客户端记录了,这时候你再换一个签名文件更改你的应用签名,点微信登陆就会出现没反应,并且友盟的那些回调都没有调用的情况,在更改签名后如果发现自己所有的配置和代码都没有问题的话可以删除手机上的微信。然后重新安装应用即可(网摘)
2、之前所说的应用的keystore一定是要微信认识的,一定要确认好
3、配置工程问题:必须要有wxapi这个包名(而且必须在你注册的微信应用包名下,比如你注册的包名是com.rs.user,那么wxapi,必须是com.rs.user.wxapi),同时必须有WXPayEntryActivity这个类名,否则无法调起微信支付,(开发文档没有标注,废了好大周章).不只是这个还有微信登陆也是名称是WXEntryActivity,也是在wxapi下。此外一定要记得在AndroidManifest.xml下配置该Activity
&android:name=&.wxapi.WXPayEntryActivity&
&android:exported=&true&
&android:launchMode=&singleTop& /&
&4、WXPayEntryActivity监听微信支付的结果你在这里注册api,轮询监听支付结果:
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
&builder.setTitle(R.string.app_tip);
&builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
&builder.show();
5、当一直返回-1(可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等),当你确定你的应用签名无误,应用id存在,并且可用。这个时候你可能就会怀疑后端给你返回的是否有误。我之前一直尝试自己去做签名验证,后来真的可以了。其实这样是没有必要的,如果你怀疑后端给你的数据有误微信开放平台上是有在线签名验证的&&
另外说一下它的大体流程:
用户在app端选择商品下单点击去支付----&app把商品信息传给后端-------&后端对信息进行加密(规则微信开放平台上)发给微信,获取预支付id-------&因为客户端调起微信支付需要7个参数,服务端做好再一次签名传给app(这个签名放在服务端是比较安全的,它的签名包括了app端看不到商户key)--------》app获取参数调起微信支付------》微信平台上的事,app这里负责监听支付结果结束后自动返回该app页面
注:下划线表示可以让设计先去把需要的图片做好,到申请时可以直接用
& & & & 申请涉及商户账目所以最好是给相关人员去申请,涉及到类似应用签名的技术配合即可
& & & & 审核也需要时间,所以最好提前申请&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2981次
排名:千里之外
原创:10篇
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
威锋网7月10日消锋网7月10日消息,《植物大战僵尸2》 如今...
威锋网7月10日消息,《植物大...
近日,开发商 Esquilax Games ..
说到方块游戏,相信有很多朋友应该还会记得 Gavina Games 早...
威锋网7月10日消息,《植物大...
近日,开发商 Esquilax Games ..
说到方块游戏,相信有很多朋友应该还会记得 Gavina Games 早...
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
再吸金!SE推出《最终幻想:全员勇者》钥匙扣
您需要通过验证再能继续浏览 3秒后开始验证
威锋旗下产品
Hi~我是威威!
 粤公网安备 11号
新三板上市公司威锋科技(836555)
增值电信业务经营许可证:
Powered by Discuz!99%的人已经被微信支付坑了不少钱,最隐蔽的三大漏洞,你中招了吗?
99%的人已经被微信支付坑了不少钱,最隐蔽的三大漏洞,你中招了吗?
夜晚讲科技
手机支付现在对于男女老少出门使用不可缺少的一个软件,微信支付就更常见了,大家在使用微信支付时候,并不知道微信支付的漏洞是多危险,下面跟大家说一下,教你如何解决漏洞问题当你支付的时候会出现这个码吗?也就是说,当手机被盗,而犯罪分子手上又有那种扫码设备的话,你的钱可以跳过支付密码直接划走,出现这种情况,点击右上角当你支付时,出现这句话时,说明微信支付时存在风险的点击右上角后,会出现两个选项,如果选择停止使用,则每次使用收付款时都要输入支付密码。在这里更推荐使用开启手势密码,因为更加方便,更安全输入你设置的手势密码,你的密码就设置成功,密码千万不能泄露,这样以后的资金加密度更深一层这是有关收付款说明,连马云都不知道的微信支付漏洞,大家要细读每一条,为了保证资金安全
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
夜晚讲科技
百家号 最近更新:
简介: 软件,通信,无线,移动互联网等资讯客服:95017
APP端开发步骤
IOS开发要点说明
以下项目开发环境以Xcode6.0,运行环境为IOS7.0为例,说明其开发中需要的操作。
1、项目设置APPID
商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID。如图8.7标红位置所示。
2、注册APPID
商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:
[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
3、调起支付
商户服务器生成支付订单,先调用【】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:
PayReq *request = [[[PayReq alloc] init] autorelease];
request.partnerId = @"";
request.prepayId= @"fc314aa427";
request.package = @"Sign=WXPay";
request.nonceStr= @"a462b76eed6e13c64b4fd1c";
request.timeStamp= @"";
request.sign= @"DD2B03AD8CB16E7A256";
[WXApi sendReq:request];
注意:该sign生成字段名列表见
4、支付结果回调
照微信SDK Sample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意 一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:
-(void)onResp:(BaseResp*)resp{
if ([respisKindOfClass:[PayRespclass]]){
PayResp*response=(PayResp*)
switch(response.errCode){
caseWXSuccess:
			//服务器端查询支付通知或查询API返回的结果再提示成功
			NSlog(@&支付成功&);
	default:
	NSlog(@&支付失败,retcode=%d&,resp.errCode);
回调中errCode值列表:
展示成功页面
可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
无需处理。发生场景:用户不支付了,点击取消,返回APP。
Android开发要点说明
1、后台设置
商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面,如图8.8红框内所示。
应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如DEMO中的package="net.sourceforge.simcpux"。
应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如图8.9所示,绿色串即应用签名。签名工具下载地址
2、注册APPID
商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信
msgApi.registerApp("wxd930ea5d5a258f4f");
3、调起支付
商户服务器生成支付订单,先调用统一下单API(详见第7节)生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";
request.partnerId = "";
request.prepayId= "fc314aa427",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "f";
request.timeStamp= "";
request.sign= "7FFECB600D810D2D8F28BC2811827B";
api.sendReq(request);
注意:该sign生成字段名列表见
4、支付结果回调
参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:
publicvoidonResp(BaseRespresp){
	if(resp.getType()==MAND_PAY_BY_WX){
		Log.d(TAG,&onPayFinish,errCode=&+resp.errCode);
		AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
		builder.setTitle(R.string.app_tip);
回调中errCode值列表:
展示成功页面
可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
无需处理。发生场景:用户不支付了,点击取消,返回APP。

我要回帖

更多关于 微信扫商家二维码支付 的文章

 

随机推荐