Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android微信支付

Android微信支付

編輯:關於Android編程

支付接入流程

官方文檔

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5

項目的應用(AppRegister有什麼用?求指導)

1.導入jar包
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN

2.清單文件的配置
 
    

    
        
            
        
    

3.初始化的類
package com.lx.edu.wxapi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.lx.edu.common.Constant;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;

public class AppRegister extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        final IWXAPI api = WXAPIFactory.createWXAPI(context, null);
        api.registerApp(Constant.PAY_WX_APP_ID);
    }
}

4.支付的調用類

package com.lx.edu;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.BroadcastReceiver;
/**
 * 
 * @項目名稱:LxeduComm
 * @類名稱:PaymentActivity
 * @類描述: 微信支付
 * @創建人:sdh
 * @創建時間:2015-1-19下午3:05
 * @version
 */
public class ServiceOrderActivity extends Activity implements OnClickListener {
    protected static final String TAG = "ServiceOrderActivity";
    private Context mContext;
    private String selectPayment;
    private StringBuffer sb;
    private PayReq req;
    Map resultunifiedorder;
    private RadioButton radiobtnWXPay;
    private RadioButton radiobtnAliPay;
    private String payInfo;
    private String outTradeNO;
    private  SharedPreferencesUtil share;
    String sign;
    String partnerid;
    String noncestr;
    String package_str;
    String prepayid;
    String out_trade_no;
    String timestamp;
    //初始化微信的api對象
    final IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);
    private Handler handler = new Handler();
    private Runnable runnable = new Runnable() {
        public void run() {
            payResult();
            handler.postDelayed(this, 5000);
        }
    };

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_payment);
        mContext = ServiceOrderActivity.this;
        init();
        radiobtnAliPay.setChecked(true);
        // 注冊廣播 支付成功後發送了廣播  這裡進行接收
        IntentFilter filter = new IntentFilter();
        filter.addAction(Constant.ACTION_MESSAGE_WXPAY_SUCCESS);
        mContext.registerReceiver(receiver, filter);
    }

    private void init() {
        //注冊APPID 這裡的appid是注冊後拿到的  寫死在了配置文件裡面
        msgApi.registerApp(Constant.PAY_WX_APP_ID);
        sb = new StringBuffer();
        req = new PayReq();
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.btn_pay:
            getNetDataForWx(serviceInstId,studentId);
            break;
        default:
            break;
        }
    }
    //微信網絡接口調用  後面會貼出接口文檔
    private void getNetDataForWx(String serviceInstId,String studentId){
        final TranLoading loading = new TranLoading(mContext);
        loading.show();
        RequestParams params = new RequestParams();
        params.addBodyParameter(Constant.NET_USERID,
                share.getString(Constant.SP_USERID, ""));
        params.addBodyParameter(Constant.NET_TOKEN,
                share.getString(Constant.SP_TOKEN, " "));
        params.addBodyParameter(Constant.NET_STUDENT_ID,studentId);
        params.addBodyParameter(Constant.NET_SERVICEINST_ID, serviceInstId);
        HttpUtils http = new HttpUtils(Constant.HTTP_TIME_OUT_LONG);
        http.send(HttpRequest.HttpMethod.POST, UrlUtis.SERVICE_ORDER_PAY_WX,
                params, new RequestCallBack() {

                    @Override
                    public void onSuccess(ResponseInfo responseInfo) {

                        try {
                            JSONObject jsonObject = new JSONObject(
                                    responseInfo.result);
                            final String success = jsonObject
                                    .getString("success");
                            Log.e(TAG, jsonObject.toString());
                            JSONObject ob = new JSONObject(jsonObject
                                    .getString(Constant.NET_OBJ));
                           sign=ob.getString("sign");
                            partnerid=ob.getString("partnerid");
                            noncestr=ob.getString("noncestr");
                           package_str=ob.getString("package_str");
                            prepayid=ob.getString("prepayid");
                            out_trade_no=ob.getString("out_trade_no");
                            timestamp=ob.getString("timestamp");

                            if (Constant.NET_ALI_SUCCESS_TRUE.equals(success)) {
                                payForWX();
                            } else if (Constant.NET_ALI_SUCCESS_FSLSE
                                    .equals(success)) {
                                final String msg = jsonObject.getString("msg");
                                ViewUtil.shortToast(mContext, msg);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        loading.dismiss();
                    }

                    @Override
                    public void onFailure(HttpException error, String msg) {
                        loading.dismiss();
                        ViewUtil.shortToast(mContext,
                                mContext.getString(R.string.error_net));
                    }
                });

    }

    // 輪循接口
    private void payResult() {
        final TranLoading loading = new TranLoading(mContext);
        loading.show();
        RequestParams params = new RequestParams();
        params.addBodyParameter(Constant.NET_OUTTRADENO, outTradeNO);
        params.addBodyParameter(Constant.NET_TOKEN,
                share.getString(Constant.SP_TOKEN, " "));
        HttpUtils http = new HttpUtils(Constant.HTTP_TIME_OUT_LONG);
        http.send(HttpRequest.HttpMethod.POST,
                UrlUtis.SERVICE_ORDER_PAY_RESULT, params,
                new RequestCallBack() {

                    @Override
                    public void onSuccess(ResponseInfo responseInfo) {

                        try {
                            JSONObject jsonObject = new JSONObject(
                                    responseInfo.result);
                            Log.d(TAG, jsonObject.toString());
                            JSONObject ob = new JSONObject(jsonObject
                                    .getString(Constant.NET_OBJ));
                            final String payStatus = ob
                                    .getString(Constant.NET_PAYSTATUS_RESULT);
                            if (Constant.NET_PAYSTATUS_PAID.equals(payStatus)) {
                                // 成功
                                handler.removeCallbacks(runnable);
                                ViewUtil.shortToast(mContext, mContext
                                        .getString(R.string.pay_success));
                            } else if (Constant.NET_PAYSTATUS_FAIL
                                    .equals(payStatus)) {
                                // 失敗
                                ViewUtil.shortToast(mContext, mContext
                                        .getString(R.string.pay_status_fails));
                            } else {
                                // 支付中
                                ViewUtil.shortToast(mContext, mContext
                                        .getString(R.string.pay_be_sure));
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        loading.dismiss();
                    }

                    @Override
                    public void onFailure(HttpException error, String msg) {
                        loading.dismiss();
                        ViewUtil.shortToast(mContext,
                                mContext.getString(R.string.error_net));
                    }
                });
    }

    // 微信支付
    private void payForWX() {
        IWXAPI api;
        api = WXAPIFactory.createWXAPI(this, Constant.PAY_WX_APP_ID);
                            PayReq req = new PayReq();
                            req.appId = Constant.PAY_WX_APP_ID;
                            req.partnerId       = partnerid;
                            req.prepayId        = prepayid;
                            req.nonceStr        = noncestr;
                            req.timeStamp       = timestamp;
                            req.packageValue    = package_str;
                            req.sign            = sign;
                            req.extData         = "app data"; 
                            api.sendReq(req);
    }
    private BroadcastReceiver receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String wxPay=intent.getStringExtra(Constant.EXTRA_WXPAY);
            String action = intent.getAction();
            if(Constant.ACTION_MESSAGE_WXPAY_SUCCESS.equals(action)&&Constant.EXTRA_WXPAY_SUCCESS.equals(wxPay)){
                CommonUtils.getServiceData(mContext);
                 ServiceOrderActivity.this.setResult(RESULT_OK, intent.putExtra(
                        Constant.EXTRA_SERVICE_PAY_SUCCESS,
                        Constant.EXTRA_SERVICE_PAY_SUCCESS_TRUE));
                finish();
            }
        }

    };
    public void onDestroy() {
        if (mContext != null) {
            mContext.unregisterReceiver(receiver);
        }
        super.onDestroy();
    }

    }

\

<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxociAvPg0KPHByZSBjbGFzcz0="brush:java;"> 5,支付回掉 package com.lx.edu.wxapi; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import com.lx.edu.R; import com.lx.edu.common.Constant; import com.lx.edu.common.Rules; import com.lx.edu.common.ViewUtil; import com.tencent.mm.sdk.constants.ConstantsAPI; import com.tencent.mm.sdk.modelbase.BaseReq; import com.tencent.mm.sdk.modelbase.BaseResp; import com.tencent.mm.sdk.openapi.IWXAPI; import com.tencent.mm.sdk.openapi.IWXAPIEventHandler; import com.tencent.mm.sdk.openapi.WXAPIFactory; public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pay_result); api = WXAPIFactory.createWXAPI(this, Constant.PAY_WX_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) { if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { if (resp.errCode == 0) { //支付成功 ViewUtil.shortToast(WXPayEntryActivity.this, getString(R.string.pay_success)); Intent intent1 = new Intent(); intent1.setAction(Constant.ACTION_MESSAGE_WXPAY_SUCCESS); intent1.putExtra( Constant.EXTRA_WXPAY,Constant.EXTRA_WXPAY_SUCCESS); sendBroadcast(intent1); } else if (resp.errCode == -2) { ViewUtil.shortToast(WXPayEntryActivity.this, getString(R.string.pay_fails)); } else { ViewUtil.shortToast(WXPayEntryActivity.this, getString(R.string.pay_status_fails)); } WXPayEntryActivity.this.finish(); } } }

微信支付陷阱

1.交互時序圖

\


WXEntryActivity這個回調界面實際上不會影響前面的調起支付的邏輯,這個Activity一定要放到“App包名.wxapi”的package中,否則無法響應回調,
當然別忘了在AndroidManifest.xml中注冊。(是根據反射找到的這個類)

首先如果要使用微信支付的話,必須先到微信開放平台注冊應用,具體地址為https://open.weixin.qq.com/,注冊時需要填應用的包名和簽名,注意
這裡的簽名是App正式版的簽名,可以找一個已上線的包或打一個正式包,使用微信提供的工具(簽名工具下載地址為https://open.weixin.qq.com/zh_CN
/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk)來獲取,獲取後填上即可。待審核通過後,會得到一個AppID和AppSecret,AppID
分享和支付都要用到,AppSecret沒什麼實際用途,此時微信分享能力是直接擁有的,支付能力還要額外申請,其中涉及到財務信息等,最好讓公司財務部門去申請,
申請成功後會拿到一個商戶id,後面生成sign時會用到。只有所有審核都通過後,才可調用微信支付功能,這點是前提。

測試微信支付時,務必對自己的App做正式簽名,因為一開始就在微信平台注冊過簽名信息,微信SDK會做校驗,只有這樣才能調起微信分享和微信支付,直接debug版的
包則絕對調不起來,這點務必注意,很多人是跌在這裡了!當初做微信分享曾遇到過,所以會很留心,也因為如此,如果微信分享能調起來,微信支付不行,那就不要懷
疑簽名問題了

還是簽名,網上有人說要注意大小寫,這點其實是不必的。在微信開放平台看到審核通過的App的簽名是大寫的,而用微信簽名獲取工具獲得的則顯示小寫,這個沒關系,
不要貿然改動平台注冊信息,不然又可能導致漫長的審核等待,上面也說了,微信分享如可以,那就不是簽名問題。

生成sign時特別需要注意,首先將key-value鍵值對拼成字符串,注意key都要小寫,如appid,noncestr,package,partnerid,prepayid,timestamp,key,並且名
字得按上述名稱,我們遇到的錯誤就是因為partnerid寫成了partnerId,prepayid寫成了PrepayId,當然我們是在服務端寫的,如果在客戶端生成sign的話,也需要注
意大小寫及名稱,詳細信息請參考官方文檔。還有這裡的key並非AppID或AppSectet,而是在商戶平台設置的,官方描述為“key設置路徑:微信商戶平台(pay.weixin.qq.com)
>賬戶設置-->API安全-->密鑰設置”。對於noncestr,申請prepayid和生成sign時兩次需要用到

req.packageValue=”Sign=WXPay”,一般都是這樣寫死這個參數值。也有人說寫成req.packageValue=”prepay_id=” + prepayid,經測試Android兩種寫法都是可以
調起微信支付的,至少最新版本SDK是可以的,以後則不清楚,官方也建議寫Sign=WXPay。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved