聊聊Android开发之微信支付不得不说的故事
程序员文章站
2022-05-09 20:38:03
聊聊Android开发之微信支付不得不说的故事
整个微信支付是挺复杂的,但是根据微信官方建议,Android客户端需要做的事情其实很少,就是调起支付,而支付之前的工作交给服务端,...
聊聊Android开发之微信支付不得不说的故事
整个微信支付是挺复杂的,但是根据微信官方建议,Android客户端需要做的事情其实很少,就是调起支付,而支付之前的工作交给服务端,包括生成预支付订单等等。。。
一、 个人总结的集成步骤及注意事项
看了官方文档可能还是有些小迷茫吧,或者是集成过程中各种各样的问题吧。。跟我我的步骤走吧。亲测可行。
引入资源包:现在AndroidStudio的话可以直接添加依赖即可,上面Android开发资源里面有介绍。
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' 或者 compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'在微信开放平台申请开发应用,上面Android端集成流程有介绍,主要是包名、应用签名的问题。 Android端调起微信支付,下面这段代码是调起微信支付的代码,req 是一个 对象,我们需要创建这个对象,并且给它的属性赋值,然后mWxapi.sendReq(req)
,那么这些值从哪里来的呢?是从我们的服务端来的,因为下单什么的都需要在服务端做!也就是说,我们先请求我们的服务器去下单,服务器调用微信api下单,然后我们的服务器会把我们调取支付方法需要的数据返回给我们的!这里就是 PayOrderBean 。所以,什么签名啊、时间戳啊我们统统不用管!只关心调取支付的方法,其他的不是我们客户端做的!
private void sendPayReq(PayOrderBean info){ mWxapi = WXAPIFactory.createWXAPI(OrderActivity.this, info.getValue().getAppid()); PayReq req = new PayReq(); req.appId = info.getValue().getAppid(); req.partnerId ="XXXXXXXXXX"; req.prepayId = info.getValue().getPrepayid();//预支付id req.nonceStr = info.getValue().getNonce_str();//32位内的随机串,防重发 req.timeStamp = String.valueOf(info.getValue().getTimeStamp());//时间戳,为 1970 年 1 月 1 日 00:00 到请求发起时间的秒数 req.packageValue ="Sign=WXPay"; req.sign = info.getValue().getSign(); // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信 mWxapi.registerApp(info.getValue().getAppid()); boolean b = mWxapi.sendReq(req); Global.showToast(b+""); }做到这里,就可以调取微信支付了。。。试试吧 下面说一下回调,直接把Demo中的wxapi/WXPayEntryActivity.java拷到你的项目中,比如你的包名cn.demo.family ,那么这个java文件的路径应该是cn.demo.family.wxapi/WXPayEntryActivity.java
import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.os.Bundle; import android.util.Log; import com.tencent.mm.opensdk.constants.ConstantsAPI; import com.tencent.mm.opensdk.modelbase.BaseReq; import com.tencent.mm.opensdk.modelbase.BaseResp; import com.tencent.mm.opensdk.openapi.IWXAPI; import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; import com.tencent.mm.opensdk.openapi.WXAPIFactory; import cn.shundao.family.R; import cn.shundao.family.base.Constant; public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity"; private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.pay_result); api = WXAPIFactory.createWXAPI(this, Constant.APP_ID); 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) { System.out.println("---resp1--"+resp.errCode); 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(); System.out.println("---resp2--"+resp.errCode); } } }清单文件中注册
至此,微信支付集成完毕。
二、需要注意的地方
微信支付需要打签名包,不能用debug包。
如果调不起支付界面,请检查你的包名、应用签名、是否是签名包、PayReq 属性值对不对(尤其是商户号,别看是服务器返回来的跟你没关系,也可能本来就是错的……)等等。 WXPayEntryActivity.java这个文件别自己写了,直接把Demo中的复制过来,以防出错,你可以选择把setContentView(R.layout.pay_result);注释掉,就不用复制布局图片等资源进来的,还有onResp方法里的对话框,你都可以注释掉,但是其他的就不用动了!!! 最后一点,如果集成不成功,一定是你哪里写错了,冷静下面仔细看一看吧。上一篇: HIVE载入本地数据文件报错问题解决办法