android 微信二维码扫码空白页支付调出空白页

10:11 提问
安卓实现微信支付,怎么调不出微信支付的页面。
安卓实现微信支付,怎么调不出微信支付的页面。
目前没有请求后台 只是测试
微信支付测试demo需要哪些条件
按赞数排序
看一下这个: 注意所有操作都是要打包签名才能成功的!
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!
需要申请测试的key或者使用正式key打包测试
支付的业务流程
app端签名微信支付你这个我不知道你说的是支付的时候数据签名还是用keystore打包签名app
你看这个链接
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(req);
注意:该sign生成字段名列表见调起支付API
WXPayEntryActivity
微信支付这个类是处理回调的是吗
这个类的名字可以修改吗
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐微信支付仅能成功调用一次问题的解决方法(Android)
转载 & & 作者:xinluqishi
这篇文章主要介绍了微信支付仅能成功调用一次问题的解决方法,感兴趣的小伙伴们可以参考一下
本人使用Android开发有一段时间了,但是本身没有系统学,而且多年专注服务端开发,总觉得因为项目需要接触Android移动端开发只是暂时的,所以没有太上心,结果碰到一个大难题折腾了一天,最后被有经验的小伙伴提示了一下才迎刃而解,感觉无地自容的同时,又非常窃喜,毕竟跨过一个一个的坎,就成长了,在这里丢人等换个地方就成牛了也未可知,哈哈。闲言就絮叨到这里,赶紧分享:&
微信支付调用接口整体的流程有必要简述一下(目前网上的资料大部分都是适配微信支付旧版的代码,最新的微信支付官方文档中并没有服务端的Demo,而且一些接口都变了,参数名称也有变化,希望小伙伴们能够注意):
&1. 微信支付不需要访问获取Token那个接口了;
&2. 直接访问 获得Prepayid,参数以 xml格式传输就可以;
&3. 有了Prepayid再加上一些其他的官网中提到的参数就可以调起客户端的微信支付接口了;&
此时就出现问题了:第一次调用非常OK,看到了微信支付界面,有自己生成的订单号还有金额,但是放弃支付后再进入,就连微信客户端都调用不起来了,换个订单也是这样,换个手机也是第一单可以调用微信客户端,展示订单号,金额,但是第二单说什么也不行了,定格在自己APP的支付界面,不报错,任何反应也没有。&
原因就出现在这里: 我们申请微信支付的时候,有个地方会让你填写你的应用Key:&
申请以后你看到的就是图片上的应用签名,这个签名是如何生成的在这里有介绍:
问题是这个Key的生成是跟正式发布时打包做签名有关的,我们把Android应用公开release的时候会将这个Key加进去作为应用的key防止被恶意覆盖等等,我们在申请注册微信应用的时候必然要提供正式生成的这个应用的Key给微信官网。&
因此这件事就被忽略了,以至于在开发的过程中,我们在自己的本地运行打包,访问微信服务器调起支付的时候,微信第一次拿到了我们的应用发来的请求,仿佛建立了连接开始了心跳,&
这时微信会异步地根据留存的应用包名和应用Key与你现在发送的包名和应用Key进行验证,我相信即使你第一次进行付款,也是很有可能不成功的,但是这块我就没有验证了,因为这个时候已经有验证结果回调回来了。&
所以跟运维人员拿了Release时把Key打到APK安装包里的命令,进行包含正式Key的打包,命令如下:&
``` cordova build --release android
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA1 -keystore E:\android-release-key.keystore E:\项目名称\platforms\android\build\outputs\apk\android-release-unsigned.apk android-release-key.keystore
//运行完这条命令需要输入密码
zipalign -v 4 E:\项目名称\platforms\android\build\outputs\apk\android-release-unsigned.apk a.apk
问题就解决了。每次访问都能顺利地调用微信支付了。 不得不感慨下,微信用这一手也严格控制了在他那里注册的应用,注册一个Key用一个,再想用,那么重新走流程吧。
本文已被整理到了《》,欢迎大家学习阅读。
更多精彩内容点击《》,《》欢迎大家学习阅读。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具android调用微信支付,填坑
关于android调用微信支付,在网上基本是骂声一片。在于官方文档,对于许多问题都没有描述。我罗列一下我遇到的麻烦,供大家参考
首先想要获取微信支付功能,必须在微信开放平台,申请app 支付能力,根据官方文档,按照要求,完成后 官方会提供 appid .appsercert两个重要参数。以及自己设置的应用签名
一:官方文档
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
根据官方文档,app需要先调用预支付接口获得 prepayid 等,按照要求来不能出错,
值得注意的是sign ,参考签名生成算法
vczhuanHqcP7yfqzybmkvt+jrMTjv8nS1NTa19S8us/uxL/W0LTy06HX1Ly6tcTK/b7dus1zaWduIMi7uvO6zcepw/u5pL7ftcSxyLbUPGJyIC8+DQo8c3Ryb25nPjxlbT6jqNK7sOO5q8u+tcTP7sS/u+HRodTx1Nq3/s7xtsvX9rrD1eLQqaOszOG5qb3Tv9rE477Nv8nS1LvxyKFwcmVwYXlfaWSjqTwvZW0+PC9zdHJvbmc+PC9wPg0KPHA+vdPPwsC0vs3Kx7X308POotDF1qe4tqOs0rLKx7rcv9O1xLXYt708YnIgLz4NCjxpbWcgYWx0PQ==":" src="https://www.2cto.com/uploadfile/Collfiles/3.png" title="\" />
调用微信支付代码不多,对应填参数就可以 。不要忘记先注册app到微信
用过微信充话费的话,都知道支付完成,会跳转到一个订单描述,提示订单完成的界面,点击完成按钮,返回聊天界面(第三方app 肯定要跳转到我们自己的app里面)。微信支付在官方文档没有提到这些怎么操作,但是看给的支付例子demo,可以看到有个WXPayEntryActivity.class他的包名必须是项目包名+wxapi
在WXPayEntryActivity.class里面对返回response判断,做自己的处理,这个界面不能少,少了就返回不了自己的app,
我选择response.errcode==0,立马跳转,关闭这个界面。
接下来是我遇到最让我头痛的问题,运行程序,第一次可以正常支付,但是以后再也不行,errcode==-1,即使是官方的demo也是如此。对于一个菜鸟来说根本不知道发生了什么。查看官方的说明
参数不对,我一遍又一遍的对参数,还是不行。想shi的心都有,请教别人的时候大多说是参数不对,对照签名工具什么的慢慢查吧。我界面别人的手机发现官方的demo和自己的东西都是可以支付的,我还以为自己的手机坏了,想着换手机,shit. 结果确实他们第二次支付的时候都返回errcode==-1. 在网上查啊查 有人说要在配置文件中设置
据说这里不填,偶尔会有一些意外收获。胆子大的可以试试。然后这个方法还是没有解决问题尝试第二种方法: 清微信缓存。这难道是一个调用方法吗?结果大吃一惊 给你们演示一下:
这个百分百可以成功。唯一不解的是,即使卸载微信,重新安装也不一定每一次都可以。但是这种方法明显不能去用,难道打个Toast 让用户先清除一下先???即使有这样的方法调用,那也将用户的有用数据,比如未读消息给清楚掉,每次还要重新登录微信。
下一个方法就是应用签名!!!!将自己的应用签名换成和微信开放平台上应用签名一致,简单的说就是第一次应用签名的时候有个.keystore文件,拿过来重新布置一下(对于签名不熟悉的童鞋,可以百度一下)。注意一点微信开放平台上面的包名必须和你在配置文件中注册的包名一致我拿官方支付的demo演示一下
再次运行官方的demo,每次都是可以支付了
《又说错的地方,欢迎大家指出来 毕竟我也是一只菜鸟》接触微信支付之前听说过这是一个坑,,,心里已经有了准备。。。我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束。。。进入正题
开发准备:
1.在微信开放平台申请账号
2.成功后创建应用,就是填一些看似很官方很正经的资料了。。。(说审核7天左右,没有意外的情况下你的app第二天就审核成功了是不是很开心,有了appid,是不是就可以调用微 & 信支付了????-------想多了,真的)
3.微信支付是需要额外申请的:需要资料审核,账户验证,协议签署等步骤,(我记得,,资料审核要填写的东西好多,,,好多,,,账户验证就是你审核成功后微信会发送邮件到你 & 注册时登记的邮箱账号,其中含有随机金额用于账户验证,协议签署,略,太简单)一定要好好阅读你邮件的任何信息,因为有的细节错了,,,你可能填坑很久。。。。。。
正式开发阶段:
调用官方的SDK发现只能成功的调起一次微信,再次支付的时候怎么也调用不起来了
似乎不是什么正经方法:在手机设置中管理应用程序,清除微信数据,缓存,,再来一遍,绝对可以调起来(当然还是只是一次。。。。)
我认为要用微信支付嘛,,就只看了调用支付接口的文档:
后来发现需要的参数prepayid是怎么也找不到啊,,后来才发现这个prepayid是先调用”统一下单“这个接口时候温馨反过来的东西,但是官方的SDK中并没有统一下单的代码。坑吗???
所以要先看统一下单文档了&
1.使用自己的APP调用的时候把官网down下来的SDK中WXPayEntryActivity拷贝到自己的项目,所在包的名字最后一定是.wxapi(我连包一起拷了。。。。)
2.在项目清单文件中填写:
&3.SDK中的AppRegister拷贝下来,,,里面换成你自己的appid,然后在项目清单中也注册一下。
4.重点来了,,就是你APP要调微信支付的activity,我这还叫PayActivity
&要调起微信支付页面,要在这个activity中,将你的app注册到微信
接下来先调用统一下单获取prepayid,参数,微信人家要xml格式的!我们就得发送xml格式的!
好了调用的时候把这个方法的返回值当参数传,,等待微信返回success吧!。。
&我遇见的错误:签名错误
我的原因是大意了&ConfigUtil.NOTIFY_URL这个参数写的空字符串
还有是因为debug版运行的,没有打包运行
返回成功之后,可以调用支付接口了
不要忘了这一步去跳转界面,,,,,
没有跳转到微信支付可能是你由运行的debug版本,,,,没有打包。。。。。
问题:支付成功或者失败后不能跳转到支付结果界面,就是官方demo中的WXPayEntryActivity类
解决:这个类必选在你的包名+.wxapi包下,必须是你的包名+.wxapi包下&你的包名+.wxapi包下&你的包名+.wxapi包下 重要的事说好多遍。。
下面是我的PayActivity完整代码:
package com.example.taijiapp.
import java.io.StringR
import java.net.InetA
import java.net.NetworkI
import java.net.SocketE
import java.util.E
import java.util.HashM
import java.util.LinkedL
import java.util.L
import java.util.M
import java.util.R
import org.apache.http.NameValueP
import org.apache.http.message.BasicNameValueP
import org.xmlpull.v1.XmlPullP
import com.example.taijiapp.R;
import com.example.taijiapp.util.C
import com.example.taijiapp.util.MD5;
import com.example.taijiapp.util.T;
import com.example.taijiapp.util.U
import com.example.taijiapp.utils.ConfigU
import com.tencent.mm.sdk.modelpay.PayR
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIF
import android.app.A
import android.app.ProgressD
import android.content.C
import android.net.wifi.WifiI
import android.net.wifi.WifiM
import android.os.AsyncT
import android.os.B
import android.util.L
import android.util.X
import android.view.V
import android.widget.B
public class PayActivity extends Activity {
private IWXAPI msgA
Map&String, String&
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay);
req = new PayReq();
sb = new StringBuffer();
msgApi = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
* 将app注册到微信
boolean registerApp = msgApi.registerApp(Constants.APP_ID);
T.show(this, "注册========"+registerApp+"");
Button appayBtn = (Button) findViewById(R.id.appay_btn);
Button check_pay_btn = (Button) findViewById(R.id.check_pay_btn);
appayBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
GetPrepayIdTask getPrepayId = new GetPrepayIdTask();
getPrepayId.execute();
* 将该app注册到微信
check_pay_btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
genPayReq();
sendPayReq();
// 生成签名参数
Button appay_pre_btn = (Button) findViewById(R.id.appay_pre_btn);
appay_pre_btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
genPayReq();
* 生成签名
private String genPackageSign(List&NameValuePair& params) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i & params.size(); i++) {
sb.append(params.get(i).getName());
sb.append('=');
sb.append(params.get(i).getValue());
sb.append('&');
sb.append("key=");
sb.append(Constants.KEY);
Log.e("拼接=====", sb.toString());
String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
Log.e("orion生成签名===", packageSign);
return packageS
* 签名工具 不含商户密钥 -暂时不用 = * 编码格式 UTF-8 = * @return
public static String createSignNoKey(List&NameValuePair& params) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i & params.size(); i++) {
sb.append(params.get(i).getName());
sb.append('=');
sb.append(params.get(i).getValue());
sb.append('&');
String signStr = sb.toString();
String subStr = signStr.substring(0, signStr.length() - 1);
// 注意sign转为大写
return MD5.getMessageDigest(subStr.getBytes()).toUpperCase();
private String genAppSign(List&NameValuePair& params) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i & params.size(); i++) {
sb.append(params.get(i).getName());
sb.append('=');
sb.append(params.get(i).getValue());
sb.append('&');
sb.append("key=");
sb.append(Constants.KEY);
this.sb.append("sign str\n" + sb.toString() + "\n\n");
String appSign = MD5.getMessageDigest(sb.toString().getBytes());
Log.e("orion", appSign);
return appS
private String toXml(List&NameValuePair& params) {
StringBuilder sb = new StringBuilder();
sb.append("&xml&");
for (int i = 0; i & params.size(); i++) {
sb.append("&" + params.get(i).getName() + "&");
sb.append(params.get(i).getValue());
sb.append("&/" + params.get(i).getName() + "&");
sb.append("&/xml&");
Log.e("orion", sb.toString());
return sb.toString();
private class GetPrepayIdTask extends AsyncTask&Void, Void, Map&String, String&& {
private ProgressD
protected void onPreExecute() {
dialog = ProgressDialog.show(PayActivity.this, getString(R.string.app_tip),
getString(R.string.getting_prepayid));
protected void onPostExecute(Map&String, String& result) {
if (dialog != null) {
dialog.dismiss();
sb.append("prepay_id\n" + result.get("prepay_id") + "\n\n");
resultunifiedorder =
protected void onCancelled() {
super.onCancelled();
protected Map&String, String& doInBackground(Void... params) {
String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");
String entity = genProductArgs();
Log.e("orion===发送过去", entity);
byte[] buf = Util.httpPost(url, entity);
String content = new String(buf);
Log.e("orion", content);
Map&String, String& xml = decodeXml(content);
public Map&String, String& decodeXml(String content) {
Map&String, String& xml = new HashMap&String, String&();
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new StringReader(content));
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
String nodeName = parser.getName();
switch (event) {
case XmlPullParser.START_DOCUMENT:
case XmlPullParser.START_TAG:
if ("xml".equals(nodeName) == false) {
// 实例化student对象
xml.put(nodeName, parser.nextText());
case XmlPullParser.END_TAG:
event = parser.next();
} catch (Exception e) {
Log.e("orion", e.toString());
* 生成随机数
private String genNonceStr() {
Random random = new Random();
return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
private long genTimeStamp() {
return System.currentTimeMillis() / 1000;
private String genOutTradNo() {
Random random = new Random();
return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
* 获取设备的ip地址
public String getLocalIpAddress() {
for (Enumeration&NetworkInterface& en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration&InetAddress& enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
} catch (SocketException ex) {
private String getWifiIp() {
// 获取wifi服务
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
// 判断wifi是否开启
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ip = intToIp(ipAddress);
* 转化成Ip地址的格式
* @param i
private String intToIp(int i) {
return (i & 0xFF) + "." + ((i && 8) & 0xFF) + "." + ((i && 16) & 0xFF) + "." + (i && 24 & 0xFF);
private String genProductArgs() {
StringBuffer xml = new StringBuffer();
String ip = getWifiIp();
if (ip == "" && ip == "") {
ip = getLocalIpAddress();
String nonceStr = genNonceStr();
xml.append("&/xml&");
List&NameValuePair& packageParams = new LinkedList&NameValuePair&();
packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID));
packageParams.add(new BasicNameValuePair("body", "APPtest"));
packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
packageParams.add(new BasicNameValuePair("notify_url", ConfigUtil.NOTIFY_URL));
packageParams.add(new BasicNameValuePair("out_trade_no", genOutTradNo()));
packageParams.add(new BasicNameValuePair("spbill_create_ip", ip));
packageParams.add(new BasicNameValuePair("total_fee", "100"));
packageParams.add(new BasicNameValuePair("trade_type", "APP"));
String sign = genPackageSign(packageParams);
packageParams.add(new BasicNameValuePair("sign", sign));
String xmlstring = toXml(packageParams);
} catch (Exception e) {
Log.e("TAG", "fail, ex = " + e.getMessage());
private void genPayReq() {
req.appId = Constants.APP_ID;
req.partnerId = Constants.MCH_ID;
req.prepayId = resultunifiedorder.get("prepay_id");
req.packageValue = "prepay_id=" + resultunifiedorder.get("prepay_id");
req.nonceStr = genNonceStr();
req.timeStamp = String.valueOf(genTimeStamp());
List&NameValuePair& signParams = new LinkedList&NameValuePair&();
signParams.add(new BasicNameValuePair("appid", req.appId));
signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
signParams.add(new BasicNameValuePair("package", req.packageValue));
signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
req.sign = genAppSign(signParams);
sb.append("sign\n" + req.sign + "\n\n");
Log.e("orion==genPayReq===============", signParams.toString());
private void sendPayReq() {
boolean sendReq = msgApi.sendReq(req);
T.show(this, "微信跳转====="+sendReq+"");
里面没有的类,,,,呐:& &自己下载一下拷贝一下。。。
参考博客 & &&&
&备忘,希望能给大家带来帮助。。。
阅读(...) 评论()

我要回帖

更多关于 微信二维码扫码空白页 的文章

 

随机推荐