在本文中,我们将为您详细介绍微信支付开发的一些问题,获取到prepayId之后仍然无法H5调起支付的问题的相关知识,此外,我们还会提供一些关于android微信分享、微信支付的一些坑、Android微
在本文中,我们将为您详细介绍微信支付开发的一些问题,获取到 prepayId 之后仍然无法 H5 调起支付的问题的相关知识,此外,我们还会提供一些关于android微信分享、微信支付的一些坑、Android微信支付开发问题、Android微信支付的问题、h5调起微信支付的有用信息。
本文目录一览:微信支付开发的一些问题,获取到 prepayId 之后仍然无法 H5 调起支付的问题
微信支付需要我们在商户平台设置一个 key 的值,用来签名的关键数值
根据微信签名的规则,所有提交到服务器的参数,需要使用 key1=value1&key2=value2&....
的这种形式拼接成一个 stringA,然后 stringA&key=[设置的 key]
然后 MD5,就可以得到一个 signaure,注意参数拼接的时候顺序为从小到大排列。
这里其实可以使用 Java 的集合 TreeMap 轻松做到,TreeMap 遍历 Key 的时候就已经是从小到大排好的了
但是我在开发的时候犯了一个错,把 key 也放进 TreeMap 里面了,结果 key 也按照从小到大排列了
但是实际上规则要求 key 是在所有参数拼接之后,再拼接进行 Hash 的。
微信支付首先第一个流程是获取 prepayid 这里需要进行一次 Hash,然后如果你是 H5 支付的话,
那么 H5 支付的时候还需要进行第二次 Hash,我这里犯的第二个错就是
在获取 prepayid 进行第一次 Hash 的时候,使用 H5 支付,并没有加入 key 做最后的 Hash。
结果导致支付的时候,微信客户端闪了一下支付,然后就取消了。而微信并没有给予任何错误提示,是很难留意到自己是因为 key 的问题导致挂起支付失败的。一开始以为是微信支付配置那里的域名问题,结果并不是域名问题。微信的 js api 也已经 ready 状态成功了,js ticket 也是成功的了。
后来 github 上搜索到 wechat4j 看了人家的 H5 支付,发现原来是我这边少了一个 key。
总的来说就两个失误,第一个就是涉及微信支付的都必须 Hash,Hash 的时候最后面必须携带 key,参与 Hash 的参数从小到大排序拼接。第二个就是 key 不参与参数的排序。
android微信分享、微信支付的一些坑
微信登陆、分享做了一段时间了发现的一些坑:
1.首先,Android应用除了获取AppID外,应用还要通过审核,否则无法调起微信进行分享,并且需要在网站上填写包名和签名两个字段,签名可使用签名生成工具获取。如有特殊需要,请自行参见《Signature的生成方法》生成。
见微信开放平台-->移动应用-->常见问题-->安卓常见问题 和 微信开放平台-->资源下载-->android资源下载-->签名生成工具下载
2.第一步的签名和包名必须写对.第二个问题,就是如何接受到微信的回调
a. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity(微信支付为WXPayEntryActivity)类,该类继承自Activity()
并在manifest文件里面加上exported属性,设置为true,设置启动模式为singleTop保证它不会重复创建.
因为微信回调的时候会调起一个新的activity:WXEntryActivity,所以必须设置透明样式(不然会给用户感知到启动了一个新的activty),且在onResp方法里finish掉WXEntryActivity(WXPayEntryActivity)
例如:
<!--非要设置成透明的才不会对用户造成困扰-->
<activity
android:name=".wxapi.WXEntryActivity或WXPayEntryActivity"
android:theme="@android:style/Theme.Translucent"
android:label="@string/app_name"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="sdksample"/>
</intent-filter>
</activity>
b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法
c. 在WXEntryActivity(WXPayEntryActivity)中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,会相应onResp方法
Android微信支付开发问题
并不是所有的BAT的API都是非常好用的,微信支付就有不少的缺陷,总结一下微信支付实现中出现的问题
坑点一:
PayReq的参数 sign的生成
PayReq对象有个参数为packageValue
而sign生成时要用到packageValue,但是对应的Key是package,这里的key容易弄错
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));
坑点二:
支付回调方法
微信使用反射找到对应的类并实现的回调
微信官方给出的说明如下:
参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。
意思如下:
1、你要在创建个packageName+.wxapi的包,如:你的项目报名:com.android.qq,那你要在该包名下创建个wxapi的包
2、在该包下创建个名为 WXPayEntryActivity的Activity类,并实现 接口 IWXAPIEventHandler ,支付的回调就在该接口的 onResp(BaseResp resp)方法中进行
package com.android.qq.wxapi;
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
@Override
public void onResp(BaseResp resp) {
//处理支付回调
}
}