Android微信支付
来源:互联网 发布:函数式编程语言 编辑:程序博客网 时间:2024/05/29 07:13
Android 微信支付
又一次做微信支付,感觉坑还是不少.首先开发文档看不懂.其次给的Demo是Eclipse的,导入后还有各种问题.已经无力吐槽
Android端做微信开发还是挺简单的,主要作用是在后台.不过Android要注意以下几点:
1.商户在微信开放平台申请开发应用是所填写的包名必须和我们的APP包名对应.签名必须是根据我们的包名生成的.微信官方提供了一个APP用于生成签名
下载网址:https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
这个可以参考微信官方文档: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
2.权限问题:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
这是微信支付所需要的三个权限3.加入依赖:使用Android的加入如下依赖即可
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:1.1.6'
4.下面就是最重要的几步:(开始进行微信支付)
4.1:首先注册微信:
private IWXAPI wxApi;
/** * 初始化微信支付 */private void initWX() { if (wxApi == null) { wxApi = WXAPIFactory.createWXAPI(this, "wxf06c7839161ddd68"); wxApi.registerApp("wxf06c6659161ddd68"); }}
这个方法我是在Oncreate()方法中调用的
createWXAPI()方法中第一个参数是上下文,第二个参数是开放平台ID(也就是APPID),这个可以写为null
registerApp()注册到微信的方法,里面传递的也是开放平台的ID(也就是APPID),这个好像不能为null.w我没试过
4.2:第一次与后台交互:(点击支付按钮的时候)
private void WxPlay(String money) { boolean isPaySupported = wxApi.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT; if (isPaySupported) { mRechargePresenter.getWXPlayNumber(String.valueOf(userId),"乐乐商城-支付", money); } else { showToast("未安装微信,或者微信版本过低"); }}
这个方法是验证当前设备(APP)是否支持微信支付,()此名字是随意起的.乐乐商城-支付
主要解释:mRechargePresenter.getWXPlayNumber(String.valueOf(userId),"乐乐商城-支付", money);
这行代码时去调用网络代码,向后台传递参数.然后后台会将这些参数生成预订单返回过来.我们拿着后台返回的数据就
可以去请求支付了.
代码解释:String.valueOf(userId):后台要的UserId(用户的唯一标识),具体为什么要这个得问后台
"乐乐商城-支付" : 这个参数是微信支付时显示的:
money: 钱
4.3:处理后台返回的数据
WXPlayBean.ResponseDataBean responseData = wxPlayBean.getResponseData();WXPlayBean.ResponseDataBean.AppResponseBean app_response = responseData.getApp_response();getPlay(app_response.getAppid(),app_response.getPartnerid(),app_response.getPrepayid(),
app_response.getPackageX(), app_response.getNoncestr(),
String.valueOf(app_response.getTimestamp()),app_response.getSign());这几行代码时后台返回的json字符串转化成的Bean对象.
getPlay:拿到这些参数后调用这个方法就可以吊起微信:
public void getPlay(String appId,String partnerId,String prepayId,String packageValue, String nonceStr, String timeStamp,String sign) {try { PayReq request = new PayReq(); request.appId = "wxf064t83945hsdd68"; request.partnerId = "1485683242"; //微信返回的支付交易会话ID request.prepayId = prepayId; //暂填写固定值Sign=WXPay request.packageValue = packageValue; //随机字符串,不长于32位。推荐随机数生成算法 request.nonceStr = nonceStr; //时间戳,请见接口规则-参数规定 request.timeStamp = timeStamp; //根据包名生成的签名 request.sign = sign; // request.extData = "app data"; wxApi.sendReq(request); } catch (Exception e) { Log.e("PAY_GET", "异常:" + e.getMessage()); showToast("异常:" + e.getMessage()); }}
吊起微信主要根据prepayId(微信开放平台返回的)调动微信进行支付的.
request.appId = "wxf064t83945hsdd68"; 这个可以写死,可以通过后台传, 这个和上面注册到微信的AppId是一样的
request.partnerId = "1485683242"; 这个是商户号,写死即可.
下面这几个,是必须后台传递的.原理很简答.这些都是后台加密后传递到APP的.
//微信返回的支付交易会话ID request.prepayId = prepayId; //暂填写固定值Sign=WXPay request.packageValue = packageValue; //随机字符串,不长于32位。推荐随机数生成算法 request.nonceStr = nonceStr; //时间戳,请见接口规则-参数规定 request.timeStamp = timeStamp;
//根据包名生成的签名 request.sign = sign;
这行代码,通过名字就可以知道,发送payReq,也就是调其微信进行支付的.
wxApi.sendReq(request);
好了这次Android集成.我只做了这么多,就可以正常支付了.后面肯定有问题,只能自己去解决了
4.4:支付结果:
下载微信官方Demo可以在里面找到一个类:WXPayEntryActivity
这个类一定要在这个包名下,
我的这个类如下:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity"; private IWXAPI api; private TextView tv_text_result; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pay_result); tv_text_result = (TextView) findViewById(R.id.tv_text_result); api = WXAPIFactory.createWXAPI(this, "wxf06c7839161ddd68"); api.handleIntent(getIntent(), this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } @Override public void onReq(BaseReq req) { } @Override public void onResp(BaseResp resp) { ToastUtils.showToast(this, String.valueOf(resp.errCode) + resp.errStr); if (resp.errCode == ConstantsAPI.COMMAND_UNKNOWN) { //支付成功 tv_text_result.setText("支付成功"); } else { //支付失败 tv_text_result.setText("支付失败"); } }}这是通过界面来显示支付是否成功的.如果不需要显示界面,可以将setContentView(R.layout.pay_result);删除,
可通过土司显示
4.5:支付结果显示:
通过以上步骤可以得到微信发到APP的同步通知,但是这个通知是不能作为正确的支付结果返回给用户的.我们需要将同步通知发送的后台(主要是接收后台异步通知).
然后接收后台返回的异步通知,显示给用户是否支付成功.
4.6:注意:
测试的时候尽量使用正式的APP,
http://blog.csdn.net/qq_33689414/article/details/51169885
借用大神的博客一用.可用于给APP签名:
本次集成微信支付完成:最后附上微信官方文档:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
想了解微信支付的具体业务流程的可以参考
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3
微信官方Demo下载地址:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1
注:如有版权问题,请速联系本人.秒删.
阅读全文
1 0
- android微信支付
- android微信支付
- Android 微信支付
- android微信支付
- android微信支付
- android微信支付
- Android 微信支付
- Android 微信支付
- android微信支付
- android 微信支付
- Android 微信支付
- android微信支付
- Android微信支付
- Android微信支付
- Android微信支付
- Android微信支付
- android微信支付
- Android微信支付
- 【PAT甲级】1070. Mooncake (25)
- shiro的入门与基本运用
- 浅析读者写者模型
- js中获取el表达式的值
- 深入理解Java:SimpleDateFormat安全的时间格式化
- Android微信支付
- java抽象类
- No module named 'cPickle' python3.6.1 Anaconda4.3.21下pickle模块解决
- Mysql 启动失败 The partition with is too full!
- ubuntu14.04如何在完美切换Python2和Python3
- Javascript继承机制的设计思想
- 文本输入时禁用粘贴
- Combination Sum
- HTML中<input>和<textarea>的区别